多态的前提:1、有继承或者有接口实现
2、有子类重写调用方法
3、父类引用子类对象
可以理解为一个方法的多种状态 -》 多态
向上转型 子类对象自动类型提升 子类对象被赋值给了父类对象
即 父亲的引用指向了子类对象 儿子变成了父亲
eg : animal = cat animal.show() //ptl Cat.show()
但是 注意的是 此时的 animal 不能调用Cat类自己独有的属性和方法,即便animal是由Cat升上来的
可以这样理解 当一个儿子变成了父亲,以前喜欢玩游戏,长大了就不喜欢玩了
向下转型 当父类想要使用子类对象特有的属性和方法的时候,就强制类型转化 前提有上转型
Cat cat2 = (Cat)animal; cat2.catRun() // catRun() Cat特有
instanceof 关键字 用来判断 左边对象是否是右边的类
animal instanceof Cat // False
animal instanceof Animal //True
易错点:要想有下转型 必须要先执行上转型
eg Animal animal =new Animal();
Cat c = (Cat) animal; // error 类型转化失败
c.catRun();
修正:
eg Animal animal =new Animal();
Cat cat = new Cat();
animal = cat; // 下转型 父类引用指向子类对象
Cat c = (Cat) animal; // 上转型 此时 animal 本身就是 Cat类对象
c.catRun();
---------------------------------------------------------------------------------------------
抽象关键字 abstract
当父类的引用指向子类对象时,访问的都是子类经过重写的方法,得到的都是子类对象当前的状态参数,所以父类的某一些方法只是规定了子类必须拥有这些方法(需要重写),而父类本身是没有机会去实例对象调用这些方法的,所以基本不写方法体
抽象方法:没有方法体的方法,就是没有方法的具体实现 加上 abstract 关键字
public abstract void show(); // 有抽象方法 ,类也要加上抽象关键字,形成抽象类
但是有抽象类不一定有抽象方法
抽象类不可以new 对象,因为抽象类中可能存在抽象方法,如果可以new对象,就一点可以访问方法,而抽象方法没有方法体,是不可以访问的,所以抽象类不可以new 对象
抽象类的用途:当模板使用,能自己实现的方法就不设置抽象方法,不能实现的方法就设置抽象方法,交由子类去实现具体的业务逻辑