1.什么是多态
执行同一方法因为对象或实例不同而产生不同的结果,这就是多态
例如:
同样是打印一份文档,因为使用不同的打印机而得到不同的打印结果,
在程序中我们把打印看作是方法,不同的打印机看成是不同的对象,得到不同的结果,称之为多态。
多态的特点:同一引用类型,同样的方法在不同实例上得到不同的执行结果。
同一引用类型:一般指父类
不同:不同的实例(对象),同一方法有不同的结果
【1】编写父类
【2】编写子类,子类一定要重写/实现父类的方法
【3】运行时,父类类型 引用 子类对象
2.多态的实现形式
【1】父类类型 引用 子类对象(本质)
1 Father father = null; 2 father = new Sun("王多魚", "男"); 3 father.dream("去当兵");
father = new Sun() 父类类型引用子类对象,当调用dream方法时,执行的是被子类对象重写/实现的dream方法。(父类没有实现的方法,其通过子类实现了,称之为方法的实现)
【2】父类作为方法中的参数
【3】父类作为方法的放回值
3.类型转换
在多态中存在两种类型转换,一种是自动类型转换,一种是强制类型转换。 在引用数据 转换过程中,
自动类型转换也称向上类型转换。子类可以自动转换成父类。(子转父自动 老爸管儿子)
1 Pet pet = null; 2 pet = new Dog(); //把子类对象赋给父类
强制类型转换也称向下类型转换。父类可以强制转换成子类。(父转子强制 儿子管父亲)
子类类型 引用 = (子类)父类对象
单一般来说还需要判断父类对象的真实性,用instanceof关键字来判断
如果要调用子类特有的方法时,一定要强制类型转换,通过instanceof鉴别具体类型
obj instanceof 类/接口 判断obj是否是类/接口的实例
public void play(Pet pet) { if(pet instanceof Dog) { Dog dog = (Dog) pet; dog.catchFlyDisc(); }else if(pet instanceof Penguin) { Penguin penguin = (Penguin) pet; penguin.swimming(); } }