【JAVA基础学习笔记】ABC继承问题
刚刚有人问了我一个关于父子继承关系的例子
1 public class A{ 2 public A(){ 3 System.out.println("A") 4 } 5 public void run(){ 6 System.out.println("run A") 7 } 8 } 9 10 public class B extends A{ 11 public B(){ 12 System.out.println("B") 13 } 14 public void run(){ 15 System.out.println("run B") 16 } 17 } 18 19 public class C extends B{ 20 } 21 22 class TestABC { 23 public static void main(String[] args){ 24 A a = new C(); 25 a.run(); 26 } 27 }
这里,我们跑一下TestABC中的main方法
结果就是:
A
B
run B
为什么呢,我们这里阐述一个观点
在Java中,属性绑定到类型,方法绑定到对象
所以方法有:new谁,调用谁。
而属性则是:用谁,调用谁。
所以方法有:new谁,调用谁。
而属性则是:用谁,调用谁。
首先打印出B,是因为我们new C()的时候,下层子类会依次、从上至下的调用父类的无参构造函数,所以会依次打印出A和B
a.run()打印出run B是为什么呢,因为这里调用的是C中的run方法,因为C没有重写run方法,则调用父类的run方法打印出run B
随后,我将代码改成如下所示:
1 public class A{ 2 private int p = 11; 3 public A(){ 4 System.out.println("A") 5 } 6 public void run(){ 7 System.out.println("run A") 8 } 9 } 10 11 public class B extends A{ 12 private int p = 22; 13 public B(){ 14 System.out.println("B") 15 } 16 } 17 18 public class C extends B{ 19 public C(){ 20 System.out.println("C") 21 } 22 } 23 24 class TestABC { 25 public static void main(String[] args){ 26 A a = new C(); 27 a.run(); 28 System.out.println(a.p); 29 } 30 }
这里我带入了一个属性p,运行结果如下:
A
B
C
run A
22
上网查了很多资料都表示a.p的值应该是11,属性是不应该被重写的,所以我对22这个结果很不解。。。

浙公网安备 33010602011771号