#同样的方法/行为,经过不同的对象,表现出不同的行为,这样的现象就称为多态
小技巧
两不同一相同(不同对象调用相同的方法表现出不同的行为)这样的现象称为多态
要想实现多态必须满足一下三个条件缺一不可:
1.多态的实现必须依赖继承,在继承体系下才有多态。只有在继承关系的类之间才有多态可言
2.子类必须覆写父类中的方法
3.通过父类的引用调用子类覆写的方法
方法重写和重载的比较
方法的重写:有继承关系之间的类,子类定义了和父类除了权限不同以外,其他(方法名称,参数列表,返回值类型(向上转型除外)完全相同的方法称为子类重写了父类的方法,子类重写方法的权限>=父类方法)
方法的重载:在同一个类中,定义一组方法名称相同参数列表不同**,与返回值无关的一组方法,称为重载方法
为何重载没有提方法权限的问题?
同一个类的内部,所有的东西都是可见的,因此与权限无关
关于权限的问题,子类覆写的方法权限>=父类权限
但是如果父类是public修饰的,子类方法只能用 public
父类中用defult 子类 >=deault就行 子类可以用default protected public 都可以
关键点
如果父类方法使用private子类方法用public是否构成方法重写?
答案:是不存在重写!因为私有继承,子类压根就不知道父类中还有个私有方法怎么重写所谓重写,在父类现有的方法上进行覆盖前提是子类首先知道父类中有这个方法
static 能否被重写
static和类绑定,与具体的对象无关,所以static也不存在重写(重写是为了多态服务,多态最重要的核心是两不同一相同,不同的对象!!!!但是static与对象无关 何谈多态)
构造方法能否被重写
这个是绝对不允许重写的
重写相当于在子类中改变了原先父类的方法行为,以具体当前子类的行为为准。
总结
私有方法,静态方法,构造方法都不存在方法重写!!
静态绑定-方法重载:编译时,编译器根据用户传参的不同决定到底调用的那个方法
动态绑定-方法的重写:编译时无法确定到底调用的是那个对象的方法,只有在运行时,根据传入的方法的对象,才能知道到底调用的是那个对象的方法,这就叫动态绑定,即运行时才明确调用的哪个方法
向上转型
天然发生的向上转型,也是以后产生对象的主要方式
语法
父类名称 父类引用 = new 子类实例();
例如
Animal animal = new Dog();
释义
子类相较于父类而言,表示范围更小,表示的属性和行为更加具体
父类表示的范围更大,父类引用指向子类对象,相当于小范围(子类对象)向大范围(父类引用)的转换
父类名称 父类引用 = new 子类实例();
- 到底通过这个父类引用能调用哪些属性和方法,看父类中有哪些属性和方法,父类引用决定了能调用什么东西
- 至于调用的这个方法到底表现出什么行为,看到底new的是那个的对象!!
父类调用方法
- 通过animal 引用能调用那些方法?
看前面,animal引用的是哪个类的引用,是Animal类型的引用=>调用的方法必须在Animal中定义才能调用,子类独有的方法无法被父类调用 - 调用的这个方法到底表现出什么行为,看new的是那个对象这个对象有没有覆写父类方法,如果覆写了久调用子列覆写的方法,如果没有覆写就调用父类的方法
向上转型的优势
最直接的体现就参数统一化!!!!!
有助于总类的扩展
减少代码冗余
向上转型只能调用子类和父类共有的方法,(在父类中定义了),子类独有的方法无法被调用
向下转型
向下转型是强制类型转换,要发生向下转型,必须先发生向上转型,否则会报错,属于将大类型转为小类型
语法
子类名称 子类引用 =(子类名称)父类引用
Dog dog =(Dog) animal;//大类型的强转不一定成功,要是可以转换animal首先要指向Dog对象才能转换
判断父类是否是指向一个子类可以用instanceof关键字来判断
语法:引用名称 instanceof类 返回布尔值
eg: