目录
306-养宠物引出多态
307-方法的多态
1、方法重载体现多态
2、方法重写体现多态(父类和子类各有一个say方法)
308-对象的多态
等号左边是编译类型;等号右边是运行类型
编译类型不改变,运行类型可以改变
编译类型不变,运行类型可以指向不同的,指向Dog/Cat
309-多态快速入门
310-多态向上转型
可以调用父类中所有成员;不能调用子类中特有成员
编译阶段,看左边编译类型,编译的时候编译的是animal属性,animal没有catchmouse方法
运行阶段,看右边运行类型,现在本类找有没有这个方法,再去父类找
311-多态向下转型
就是原来ainimal指向的是子类Cat,强转只能转成cat,而不能转成dog这些
312-属性重写问题
1、属性没有重写之说,属性的值看编译类型,就是等号左边
2、instance of 判断的右边的运行类型,是否是xx类型或xx类型的子类型
313-多态课堂练习1
314-多态课堂练习2
两个指的是一个地方,要记住 b==s
public class PolyExercise02主类
public static void main(String]args){
Sub s = new Sub();
System.out.println(s.count); //20看左边编译类型
s.display(); //20 运行类型
Base b = s; //向上转型
System.out.println(b == s); // true
System.out.println(b.count);// 10,等式左边编译类型
b.display(); // 20,等式右边运行类型
}
}
315-JAVA的动态绑定机制(非常非常重要)
方法,会和该对象的内存地址/运行类型绑定
属性,没有动态绑定机制
方法,会和该对象的内存地址/运行类型绑定,所以getI()+10,这里是用的是运行类型的getI()方法,得到的是20这个值
属性,没有动态绑定机制,这里i+10,i找的是当前类,也就是父类中的i=10
316-多态数组1
person[i]的编译类型是person,运行类型是根据实际情况→JVM来判断
317-多态数组2
老师特有方法
学生特有方法
如何调用特有方法???
先判断运行类型,然后强制向下转型,就能调用特有方法了
if(person[i] instanceof Student){
((Student)persons[i]).study(); //强制向下转型
}
318-多态参数
使用了动态绑定机制,各自走各自的方法