标签:new 类型 使用 dog 出错 ext 执行 变量 mon
java引用类型有两个:
编译时类型
编译时类型由声明该变量时使用的类型决定
运行时类型
运行时类型由实际赋给该变量的对象决定
例:
1 class Animal{ 2 public int month = 2; 3 public void eat(){ 4 System.out.println("动物吃东西"); 5 } 6 7 } 8 9 class Dog extends Animal{ 10 public int month = 3; 11 12 public void eat() { 13 System.out.println("小狗吃肉"); 14 } 15 16 public void sleep() { 17 System.out.println("小狗睡午觉"); 18 } 19 } 20 21 class Cat extends Animal{ 22 public int month = 4; 23 24 public void eat() { 25 System.out.println("小猫吃鱼"); 26 } 27 } 28 29 public class Test { 30 public static void main(String[] args){ 31 Animal a = new Dog(); 32 Animal b = new Cat(); 33 a.eat(); 34 System.out.println(a.month); 35 //下面代码编译时会出错 36 // a.sleep(); 37 b.eat(); 38 System.out.println(b.month); 39 40 } 41 }
a对象编译时类型是Animal,运行时类型是Dog;
b对象编译时类型是Animal,运行时类型是Cat。
当运行时调用引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就表现出:相同类型的变量调用同一个方法时表现出不同的行为特征,这就是多态。
该例中:当他们调用eat方法时,实际调用的是父类Animal中被覆盖的eat方法。
运行结果:
小狗吃肉 2 小猫吃鱼 2
上例中main方法中注释了a.sleep(),由于a的编译时类型为Animal,而Animal类中没有sleep方法,因此无法在编译时调用sleep方法。
对象的实例变量不具备多态性
上例中a,b对象分别调用了month,可以看到,其输出结果都是2
总的来说:
引用变量在编译阶段只能调用编译时类型所具有的方法,但运行时则执行他运行时类型所具有的方法。
标签:new 类型 使用 dog 出错 ext 执行 变量 mon
原文地址:https://www.cnblogs.com/haiyuexiaozu/p/10986510.html