访问子类对象的实例变量

来源:互联网 发布:苹果mac 笔记本电脑 编辑:程序博客网 时间:2024/05/15 08:35

先上代码

class Base
{
private int i = 2;
public Base()
{
System.out.println(“base的i=”+this.i);//输出为2
System.out.println(“base的i=”+this.getClass());//输出Derived对象

    this.display();}public void display(){    System.out.println("base1的i="+this.i);    System.out.println(i);}

}
class Derived extends Base
{
private int i = 22;

public Derived(){    i = 222;}public void display(){    System.out.println("Derived的i="+this.i);    System.out.println(i);}

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

`
开始很疑惑为何输出的是0 而不是2 后来才发现这样的规则书上是这样说的:当变量的编译时类型和运行时类型不同时,系统在调用它的实例变量和实例方法时存在差异。
当this在构造器中时,this代表正在初始化的Java对象。如果this在父类的构造器中,它编译时的类型是父类的类型。

结论:当变量的编译时类型和运行时类型不同时,通过该变量访问它引用对象的实例变量时该实例变量的值由声明该变量的类型决定。但是通过该变量调用它引用的对象的实例方法时,该方法行为将由它实际所引用的对象来决定。

0 0
原创粉丝点击