声明: 本文主要作为作者的复习笔记,由于作者水平有限,难免有错误和不准确之处,欢迎读者批评指正.
目录快捷跳转
多态
同样的一个方法/行为,经过不同的对象,表现出不同的行为,这样的现象就称为多态;
多态性:两不同一相同
不同的对象,调用相同的方法,表现出不同的行为;
例如: 小猫和小狗,都吃宠物粮食,小猫吃猫粮,小狗吃狗粮;
Java中要想实现多态,必须同时满足以下三个条件,缺一不可:
- 多态的实现必须依赖继承,在继承体系下才有多态; 只有在继承关系的类之间才有多态可言;
- 子类必须要覆写父类中的方法;
- 通过父类的引用调用子类重写的方法;
方法重写(override)
在有继承关系的类之间,子类定义了和父类除了权限不同以外,其他(方法名称,参数列表,返回值类型(向上转型除外))完全相同的方法称为子类重写了父类的方法,子类重写方法的权限 >= 父类方法;
方法重载(overload)
在同一个类中,定义了一组方法名称相同,参数列表不同,与返回值无关的一组方法,称为重载方法;
为何重载没有提方法权限问题?
同一个类的内部,所有东西都是可见的,因此,与权限无关;
关于权限问题,子类重写的方法权限 >= 父类权限
如果父类方法是public修饰的,子类方法能用的权限只有public;
如果父类方法是default修饰的,子类方法能用的权限 >= default,也就是说子类使用default,protected,public;
私有方法、静态方法、构造方法都不存在方法重写
- 重写就是在子类对象中修改了父类的原有方法的表现,以当前子类对象的方法为准;
- 私有继承,子类压根不知道父类中有这个私有方法,何谈重写;所谓的重写,在父类的现有方法上进行覆盖,前提是子类首先得知道父类有这个方法;
- 父类方法使用private,子类方法使用public(不存在重写);
- static方法不存在重写; static和类绑定,与具体对象无关; 重写为了多态服务,多态最核心的是两不同一相同,不同的对象 => static没有对象,无法多态;
- 构造方法不能重写; 假设能重写,相当于在子类中改变了父类构造方法方法的行为 => 在子类中决定父类如何产生?(举个例子,儿子可以改变父亲如何产生并设置属性值,当然是绝对不可能的!)
重写和重载的区别
区别点 | 重写(override) | 重载(overload) |
---|---|---|
参数列表 | 一定不能修改 | 必须修改 |
返回类型 | 一定不能修改(除非可以构成父子类关系) | 可以修改 |
访问限定符 | 一定不能做更严格的限制(可以降低限制) | 可以修改 |
静态绑定 - 方法重载
编译时,编译器根据用户传参的不同决定到底调用的是哪个方法;
动态绑定 - 方法重写
例:
public static void fun(Animal animal){
animal.eat();
}
编译时无法确定到底调用的是哪个对象的eat方法,只有在运行时,根据具体传入fun的对象,才能知道到底调用的是哪个对象的eat方法,这就叫动态绑定; 即运行时才明确调用的哪个方法;
向上转型
天然发生的向上转型,也是产生对象的主要使用方式;
<