首先我们回顾一下多态的前提和体现:
1 有继承关系
2 有方法重写
3 有父类引用指向子类对象
用代码说话:
class Animal { public int maxAge = 0; public void call(){ System.out.println("动物会叫"); } public static void sleep(){ System.out.println("动物需要睡觉"); } } class Cat extends Animal // 继承 { public int maxAge = 20; public int averageAge = 15; public void call(){ // 方法重写 System.out.println("小猫喵喵叫"); } public void zhuoLaoShu(){ System.out.println("小猫会捉老鼠"); } public static void sleep(){ System.out.println("小猫需要睡觉"); } } class Dog extends Animal // 继承 { public int maxAge = 30; public int averageAge = 20; public void call(){ // 方法重写 System.out.println("小狗汪汪叫"); } public void watchDoor(){ System.out.println("小狗会看门"); } public static void sleep(){ System.out.println("小狗需要睡觉"); } } class DuoTaiDemo { public static void main(String[] args){ Animal a = new Cat(); // 父类引用指向子类对象 Animal a1 = new Dog(); // 父类引用指向子类对象 // (1)多态中成员变量之间的访问关系 // 规律:编译看左边 运行看左边 // 父类有什么就使用什么,父类没有就报错 System.out.println(a.maxAge); // 0 System.out.println(a1.maxAge); // 0 //System.out.println(a.averageAge); // 编译报错 找不到符号 averageAge //System.out.println(a1.averageAge);// 编译报错 找不到符号 averageAge System.out.println("-----------"); //(2)多态中构造方法之间的访问关系 //规律: 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化 System.out.println("-----------"); // (3) 多态中成员方法之间的访问关系 // 规律:编译时看左边,执行时看右边 // 编译时外界看到的是父类,只能调用父类中有的方法 // 而执行的时候,其实是子类的call方法覆盖了父类的call方法, // 所以执行的是子类中的call方法。 a.call();//输出 小猫喵喵叫 证明调用了子类的call方法 //a.zhuoLaoshu();//编译报错 :找不到符号a.zhuoLaoshu(); a1.call();//输出 小狗汪汪叫 同样证明调用了子类的call方法 //a1.watchDoor();//编译报错 :找不到符号a1.watchDoor(); System.out.println("-----------"); // (4) 多态中静态方法之间的访问关系 // 规律:编译看左边,执行看左边 // 由于静态是和类相关的,所以静态不存在重写 a.sleep(); // 动物需要睡觉 证明调用了父类的sleep方法 a1.sleep();// 动物需要睡觉 证明调用了父类的sleep方法 } } 通过上述代码分析,我们不难总结出,多态中,编译时,还是看父类的各成员,只有在执行的时候,由于成员方法有重写现象,执行了子类的成员方法,像成员属性,和静态方法,还是执行父类的。