继承方法覆盖和多态

tech2022-08-04  143

继承extends

1、什么是继承,有什么用? 继承:在现实世界当中也是存在的,例如:父亲很有钱,儿子不用努力也很有钱。 继承的作用: 基本作用:子类继承父类,代码可以得到复用。(这个不是重要的作用,是基本作用。) 主要(重要)作用:因为有了继承关系,才有了后期的方法覆盖和多态机制。

2、继承的相关特性 ① B类继承A类,则称A类为超类(superclass)、父类、基类, B类则称为子类(subclass)、派生类、扩展类。 class A{} class B extends A{} 我们平时聊天说的比较多的是:父类和子类。 superclass 父类 subclass 子类

​ ② java 中的继承只支持单继承,不支持多继承,C++中支持多继承, ​ 这也是 java 体现简单性的一点,换句话说,java 中不允许这样写代码: ​ class B extends A,C{ } 这是错误的。

​ ③ 虽然 java 中不支持多继承,但有的时候会产生间接继承的效果, ​ 例如:class C extends B,class B extends A,也就是说,C 直接继承 B, ​ 其实 C 还间接继承 A。

​ ④ java 中规定,子类继承父类,除构造方法不能继承之外,剩下都可以继承。 ​ 但是私有的属性无法在子类中直接访问。 ​ (父类中private修饰的不能在子类中直接访问。可以通过间接的手段来访问。)

​ ⑤ java 中的类没有显示的继承任何类,则默认继承 Object类,Object类是 ​ java 语言提供的根类(老祖宗类),也就是说,一个对象与生俱来就有 ​ Object类型中所有的特征。

​ ⑥ 继承也存在一些缺点,例如:CreditAccount 类继承 Account 类会导致它 ​ 们之间的耦合度非常高,Account 类发生改变之后会马上影响到 CreditAccount 类

问答:

1、子类继承父类之后,能使用子类对象调用父类方法吗? 可以,因为子类继承了父类之后,这个方法就属于子类了。 当然可以使用子类对象来调用。

2、在实际开发中,满足什么条件的时候,我可以使用继承呢? 凡是采用“is a”能描述的,都可以继承。 例如: Cat is a Animal:猫是一个动物 Dog is a Animal:狗是一个动物 CreditAccount is a Account:信用卡账户是一个银行账户 …

3、假设以后的开发中有一个A类,有一个B类,A类和B类确实也有重复的代码, 那么他们两个之间就可以继承吗? 不一定,还是要看一看它们之间是否能够使用is a来描述。

4、任何一个类,没有显示继承任何类,默认继承Object,那么Object类当中有 哪些方法呢?老祖宗为我们提供了哪些方法?

​ 以后慢慢的大家一定要适应看JDK的源代码先模仿后超越。

​ java为什么比较好学呢? ​ 是因为Java内置了一套庞大的类库,程序员不需要从0开始写代码,程序员可以 ​ 基于这套庞大的类库进行“二次”开发。(开发速度较快,因为JDK内置的这套库 ​ 实现了很多基础的功能。)

​ 例如:String是SUN编写的字符串类、System是SUN编写的系统类。 ​ 这些类都可以拿来直接使用。 ​ ​ JDK源代码在什么位置? ​ C:\Program Files\Java\jdk-13.0.2\lib\src.zip ​ ​ 你现在能看懂以下代码了吗? ​ System.out.println(“Hello World!”); ​ System.out 中,out后面没有小括号,说明out是变量名。 ​ 另外System是一个类名,直接使用类名System.out,说明out是一个静态变量。 ​ System.out 返回一个对象,然后采用“对象.”的方式访问println()方法。 ​ ​ 我们研究了一下Object类当中有很多方法,大部分看不懂,其中有一个叫做toString() ​ 的,我们进行了测试,发现: ​ System.out.println(引用); ​ 当直接输出一个“引用”的时候,println()方法会先自动调用“引用.toString()”,然后 ​ 输出toString()方法的执行结果。

方法覆盖

1、什么时候我们会考虑使用“方法覆盖”呢? 子类继承父类之后,当继承过来的方法无法满足当前子类的业务需求时, 子类有权利对这个方法进行重新编写,有必要进行“方法的覆盖”。

方法覆盖又叫做:方法重写(重新编写),英语单词叫做:Override、Overwrite,都可以。 比较常见的:方法覆盖、方法重写、override

2、重要结论: 当子类对父类继承过来的方法进行“方法覆盖”之后, 子类对象调用该方法的时候,一定执行覆盖之后的方法。

3、当我们代码怎么编写的时候,在代码级别上构成了方法覆盖呢? 条件一:两个类必须要有继承关系。 条件二:重写之后的方法和之前的方法具有: 相同的返回值类型、 相同的方法名、 相同的形式参数列表。 条件三:访问权限不能更低,可以更高。(这个先记住。) 条件四:重写之后的方法不能比之前的方法抛出更多的异常,可以更少。(这个先记住)

总结: 第一:有继承关系的两个类 第二:具有相同方法名、返回值类型、形式参数列表 第三:访问权限不能更低。 第四:抛出异常不能更多。

这里还有几个注意事项:(这几个注意事项,当学习了多态语法之后自然就明白了!) 注意1:方法覆盖只是针对于方法,和属性无关。 注意2:私有方法无法覆盖。 注意3:构造方法不能被继承,所以构造方法也不能被覆盖。 注意4:方法覆盖只是针对于“实例方法”,“静态方法覆盖”没有意义。

4、方法重载和方法覆盖有什么区别?

​ 方法重载发生在同一个类当中。

​ 方法覆盖是发生在具有继承关系的父子类之间。

​ 方法重载是一个类中,方法名相同,参数列表不同。

​ 方法覆盖是具有继承关系的父子类,并且重写之后的方法必须和之前的方法一致: ​ 方法名一致、参数列表一致、返回值类型一致。

5、方法覆盖需要和多态机制联合起来使用才有意义。 Animal a = new Cat(); a.move(); 要的是什么效果? 编译的时候move()方法是Animal的。 运行的时候自动调用到子类重写move()方法上。

​ 假设没有多态机制,只有方法覆盖机制,你觉得有意义吗? ​ 没有多态机制的话,方法覆盖可有可无。

​ 没有多态机制,方法覆盖也可以没有,如果父类的方法无法满足 ​ 子类业务需求的时候,子类完全可以定义一个全新的方法。 ​ ​ 方法覆盖和多态不能分开。

6、静态方法存在方法覆盖吗? 多态自然就和对象有关系了。 而静态方法的执行不需要对象。 所以,一般情况下,我们会说静态方法“不存在”方法覆盖。 不探讨静态方法的覆盖。

7、私有方法不能覆盖。

多态

多态的基础语法: 1、学习多态基础语法之前,我们需要普及两个概念: 第一个:向上转型 子 —> 父(自动类型转换) 第二个:向下转型 父 —> 子(强制类型转换,需要加强制类型转换符)

​ 注意: ​ java中允许向上转型,也允许向下转型。

​ 什么时候需要向下转型? ​ 需要调用或者执行子类对象中特有的方法。 ​ 必须进行向下转型,才可以调用。

​ 向下转型有风险吗? ​ 容易出现ClassCastException(类型转换异常) ​ 怎么避免这个风险? ​ instanceof运算符,可以在程序运行阶段动态的判断某个引用指向的对象 ​ 是否为某一种类型。 ​ 养成好习惯,向下转型之前一定要使用instanceof运算符进行判断。

​ 无论是向上转型,还是向下转型,两种类型之间必须有继承关系,没有继承关系编译器报错。 ​ ​ 以后在工作过程中,和别人聊天的时候,要专业一些,说向上转型和向下转型,不要说自动类型转换,也不要说强制类型转换,因为自动类型转换和强制类型转换是使用在基本数据类型方面的,在引用类型转换这里只有向上和向下转型。 ​ ​ 2、多态指的是: ​ 父类型引用指向子类型对象。 ​ 包括编译阶段和运行阶段。 ​ 编译阶段:绑定父类的方法。 ​ 运行阶段:动态绑定子类型对象的方法。 ​ 多种形态。

​ 编译期叫做静态绑定。 ​ 运行期叫做动态绑定。

​ 3、个别同学有点混乱了: ​ java中只有“类名”或者“引用”才能去“点” ​ 类名. ​ 引用. ​ 只要你想“点”,“点”前面要么是一个类名,要么是一个引用。 ​ ​ 4、什么时候必须使用“向下转型”? ​ 不要随便做强制类型转换。 ​ 当你需要访问的是子类对象中“特有”的方法。此时必须进行向下转型。

最新回复(0)