方法重写/方法覆盖

当从父类中继承过来的方法无法满足当前子类业务需求的时候,需要将父类中继承过来的方法进行覆盖。换句话说,父类中继承过来的方法已经不够用了,子类有必要将这个方法重新再写一遍,所以方法覆盖又被称为方法重写。当该方法被重写之后,子类对象一定会调用重写之后的方法。

方法重写的条件

① 方法覆盖发生在具有继承关系的父子类之间,这是首要条件;
② 覆盖之后的方法与原方法具有相同的返回值类型、相同的方法名、相同的形式参
数列表;

方法重写的注意事项

① 由于覆盖之后的方法与原方法一模一样,建议在开发的时候采用复制粘贴的方式,
不建议手写,因为手写的时候非常容易出错,比如在 Object 类当中有 toString()方法,该方
法中的 S 是大写的,在手写的时候很容易写成小写 tostring(),这个时候你会认为 toString()
方法已经被覆盖了,但由于方法名不一致,导致最终没有覆盖,这样就尴尬了;
② 私有的方法不能被继承,所以不能被覆盖;
③ 构造方法不能被继承,所以也不能被覆盖;
④ 覆盖之后的方法不能比原方法拥有更低的访问权限,可以更高(学习了访问控制
权限修饰符之后你就明白了);
⑤ 覆盖之后的方法不能比原方法抛出更多的异常,可以相同或更少(学习了异常之
后就明白了);
⑥ 方法覆盖只是和方法有关,和属性无关;
⑦ 静态方法不存在覆盖。因为静态方法不存在“对象”一说,而多态是发生在有对象的,所以静态方法和多态无关,也就和方法重写无关了,因为多态和子类的方法重写是相辅相成的。

多态

多态的理解

多态(Polymorphism)属于面向对象三大特征之一,它的前提是封装形成独立体,独立体
之间存在继承关系,从而产生多态机制。多态是同一个行为具有多个不同表现形式或形态的能
力。多态就是“同一个行为”发生在“不同的对象上”会产生不同的效果。
在 java 中允许这样的两种语法出现,一种是向上转型(Upcasting),一种是向下转型
(Downcasting),向上转型是指子类型转换为父类型,又被称为自动类型转换,向下转型是
指父类型转换为子类型,又被称为强制类型转换。
image.png
在 java 语言中有这样的一个规定,无论是向上转型还是向下转型,两种类型之间必须要有继承关系,没有继承关系情况下进行向上转型或向下转型的时候编译器都会报错,
多态就是“同一个行为(move)”作用在“不同的对象上”会有不同的表现结果。java 中之所以有多态机制,是因为 java 允许一个父类型的引用指向一个子 类型的对象。也就是说允许这种写法:Animal a2 = new Bird().父类型引用指向了子类型对象,都属于向上转型(Upcasting),或者叫做自动类型转换。
编译阶段“静态绑定”,运行阶段“动态绑定”,编译一种状态,运行一种状态。
在编译阶段编译 器只知道 a1 变量的数据类型是 Animal,那么此时编译器会去 Animal.class字节码中查找 move() 方法,( 得在父类中找此方法,才能保证编译阶段不包错,不然父类没有此方法,编译就会报错。)发现 Animal.class 字节码中存在 move()方法,然后将该 move()方法绑定到 a1 引用上, 编译通过了,这个过程我们可以理解为“静态绑定”阶段完成了。紧接着程序开始运行,进入运行阶段,在运行的时候实际上在堆内存中 new的对象是 Cat 类型,也就是说真正在 move 移动的时候,是 Cat 猫对象在移动,所以运行的时候就会自动执行 Cat 类当中的 move()方法,这个过程可以称为“动态绑定”。但无论是什么时候,必须先“静态定”成功之后才能进入“动态绑定”阶段。

对于多态的理解一定要分为编译阶段和运行阶段来进行分析,编译阶段只是看父类型中是否存在
要调用的方法,如果父类中不存在,则编译器会报错,编译阶段和具体 new 的对象无关。但
是在运行阶段就要看底层具体 new的是哪个类型的子对象了,new的这个子类型对象可以看做
“真实对象”,自然在运行阶段就会调用真实对象的相关方法。
为了避免编译报错,在向下转型时,建议在进行向下转型之前进行运行期型判断,instanceof
语法格式:

  1. (引用 instanceof 类型)

instanceof 运算符的运算结果是布尔类型,可能是 true,也可能是 false

形成多态的条件:

① 继承
② 方法覆盖
③ 父类型引用指向子类型对象
多态显然是离不开方法覆盖机制的,多态就是因为编译阶段绑定父类当中的方法,程序运
行阶段自动调用子类对象上的方法,如果子类对象上的方法没有进行重写,这个时候创建子类
对象就没有意义了,自然多态也就没有意义了,只有子类将方法重写之后调用到子类对象上的
方法产生不同效果时,多态就形成了。所以多态和方法重写是相辅相成的。

多态的作用

多态在开发中联合方法覆盖一起使用,可以降低程序
的耦合度,提高程序的扩展力。在开发中尽可能面向抽象编程,不要面向具体编程。
所谓多态就是同一个行为作用到不同的对象上,最终的表现结果是不同的,主要的要求就是对象是可
以进行灵活切换的,灵活切换的前提就是解耦合,解耦合依赖多态机制。