class Base{
private int i = 2;
public Base(){
this.display();
}
public void display(){
System.out.println(i);
}
}
class Derived extends Base{
private int i = 22;
public Derived(){
i = 222;
}
public void display()
{
System.out.println(i);
}
}
public class test{
public static void main(String[]args){
new Derived();
}
}
上面的程序输出为:0;
原因:new Derived()时,系统为其分配内存,Derived()拥有两个i的值,其中一个是父类Base的。
在Java中,如果一个this出现在构造器中时,这个this表示正在初始化的java对象。从上面的源代码看,this是在Base的构造器类的,可是这些代码实际是放在Derived()构造器内的---是Derived()构造器隐式的调用Base()构造器。所以this应该是Derived的对象。
虽然这个this是Derived对象,但当在Base()构造器里时,实际的编译类型时Base,指向一个Derived对象。所以由于多态的原因,this调用了Derived的方法,但又由于Drived的i还没初始化,所以输出的是0。如果稍微修改上面的Base对象,如下:
class Base{
private int i = 2;
public Base(){
System.out.print(this.i); //调用的是Base的i,已经初始化为2.
this.display();
}
public void display(){
System.out.println(i);
}
}
那么输出的结果将会是:20
在这个例子,实现了父类访问子类的实例变量。也从另外一方面说明了,动态绑定的只有普通成员方法。