多态父子间方法和变量的调用,到底调用的是父亲还是儿子

 1 class Super
 2 {
 3     int i=0;
 4     public Super(String a)
 5     {
 6         System.out.println("A");
 7         i=1; 
 8     }
 9     public Super()
10     {
11         System.out.println("B");
12         i+=2;
13     }
14 }
15 
16 class MultiStatementDemo extends Super
17 {
18     //int i; //打开这句,结果大不一样。
19     public MultiStatementDemo(String a)
20     {
21         //super();//改成super("a"),结果又不一样。
22         System.out.println("C");
23         i=5; 
24     }
25 
26     public static void main(String[] args)
27     {
28         int i=4;
29         Super d = new MultiStatementDemo("A");
30         System.out.println(d.i);
31     }
32 }
33 
34 /*
35     由于MultiStatementDemo类继承了Super类,当创建对象时,
36     其实在MultiStatementDemo的省略了super()这个方法,如果在Super类中,
37     没有默认构造方法,会报错,楼主可以注释掉那个无参的构造方法,
38     此时需要显示super(参数)调用父类显示的有参构造方法;
39 
40     1.题中隐式的调用了默认构造方法,此时输出了B,
41     2.由于MultiStatementDemo中没有定义i,此时,MultiStatementDemo构造方法中的i,代表的是父类的i,i=5,也是对于父类的i赋值的。
42       若在MultiStatementDemo类中声明一个成员变量i,那这个i就为子类的i,i赋值为对子类赋值。
43     3.d.i调用的仍然是父类的i,若MultiStatementDemo中没有声明i,结果为5,若MultiStatementDemo声明了i,结果为2.
44 
45 */
原文地址:https://www.cnblogs.com/hacket/p/3033977.html