这是一个很经典的案例,在这里我拿出来分享一下。大部分人做这道题都会出错的。
首先,定义一个父类Base:定义额一个i变量,一个没有参数的构造函数,并在构造函数中调用display()函数
package javaExperice; public class Base { private int i=2; public Base(){ this.display(); } public void display() { System.out.println(i); } }
package javaExperice; public class Derived extends Base{ private int i=22; public Derived(){ i=222; } public void display(){ System.out.println(i); } }最后做一个测试类:只new 了一个子类对象而已。
package javaExperice; public class Base_DerivedTest { public static void main(String[] args) { new Derived(); } }结果:
大部分的人会猜这道题很简单啊,不就是在new对象的时候调用子类的构造函数,而子类的构造函数要首先调用父类的没有参数的构造函数,因此赋值给i的是222,所以结果应该为222.但是正确答案是什么呢?答案既不是2,也不是22,也不是222,答案结果却是0.为什么会这样呢。我们需要详细的解答一下代码的执行流程:
1.调用子类的构造函数,子类的构造函数先调用父类的构造函数。因此调用父类的构造函数,执行变量i的初始化,此时i=2,接着调用display函数,但那是构造函数的this指的是谁?this是调用的就是谁,故名思议,this在子类的构造函数中,因此this 是Derived实例,到那时又在父类构造函数,因此编译类型是Base。相当于多台函数Base b=new Dervied();因此this调用的是子类重写的display();
因此结果是0
原文地址:http://blog.csdn.net/u014010769/article/details/45066283