java 访问子类对象的实例变量

class Base{
	private double i = 2;
	public Base() {
		System.out.println(this.i);
		this.display();
		System.out.println(this.getClass());
//		this.sub();
	}
	public void display(){
		System.out.println(i);
	}
}

class Drived extends Base{
	private int i = 22;
	public void sub(){
		System.out.println("Drived 的 sub()j");
	}
	public Drived() {
		i = 222;
	}
	public void display(){
		System.out.println(i);
	}
}

public class Test {
	public static void main(String[] args) {
		new Drived();
	}
}

实际输出时:

2

0

class com.javase.MyPrint.Drived

这是为什么呢?

原因就是this代表正在初始化的java对象。

      此时的this 位于Base 构造器内,但这些代码实际放在Drived()构造器内执行--是 Drived()构造器隐示调用了Base()构造器的代码。因此,此时的this 其实是Drived对象,而不是Base对象。

      既然this代表的是Drived对象,那么为什么this.i 输出的是2呢? 

因为这个this 虽然是Drived对象,但是它位于Base()内,它的编译时类型是 Base,而它实引用的是Drived对象,所以调用sub()时会发生错误。

      当变量的编译类型和运行类型不同时,通过该变量引用它的对象的实例变量时, 该实例变量的值由申明该变量的类型决定。但通过该变量调用它的引用对象的实例方法时,该方法行为将由实际引用它的对象决定。

    因此,当程序访问 this.i 时,会访问Base类中定义的i, 而调用 display()时,会输出Derived类中的i, 即0.




你可能感兴趣的:(java 访问子类对象的实例变量)