【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谁,调用谁。
而属性则是:用谁,调用谁。 
 
首先打印出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这个结果很不解。。。

posted @ 2014-04-09 17:54  水漾之舞  阅读(383)  评论(1)    收藏  举报