首先分析这个案例的执行过程。
当子类中没有声明i变量时,D=new Demo("A")。此时自动调用父类无参构造,所以控制台打印“B”,此时i等于2,接下来执行子类构造函数,然后控制台打印“C”,然后i赋值5.所以这时父类的i等于5.接下来System.out.println(D.i);当然就是5啦。
当子类中声明了i变量时,D=new Demo("A")。此时自动调用父类无参构造,所以控制台打印“B”,此时是父类的 i 等于2,接下来执行子类构造函数,然后控制台打印“C”,给i赋值5,此时是子类内部有自己的i,所以是子类的 i 等于5。接下来main函数里面System.out.println(D.i);因为使用了多态,当父类应用指向子类对象时,如果调用成员变量时,编译看父类,执行看父类。也就是说此时打印出来的是父类的i,而不是子类的i。所以是2,不是5。 |