多态--父子间方法和变量的调用,到底调用的是父亲还是儿子
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 */
by hacket