为什么两种情况下的输出不同?

时间:2015-09-02 10:36:52

标签: java field shadowing member-hiding

为什么输出在以下情况下会有所不同,即使该变量已被覆盖?

public class A {
    int a = 500;

    void get() {
        System.out.println("a is " + this.a);
    }
}

public class B extends A {
    int a = 144;
}

public class mainmethod {
    public static void main(String args[]) {
        B ob = new B();
        System.out.println("a is " + ob.a);
        ob.get();
    }
}

3 个答案:

答案 0 :(得分:6)

没有被覆盖的变量这样的东西。 B实际上有两个名为a实例变量:一个声明,另一个继承。见:

B ob = new B();
System.out.println("B.a is " + ob.a);
System.out.println("A.a is " + ((A)ob).a);

B的实例方法中,您可以编写super.a((A)this).a来访问父变量。

答案 1 :(得分:1)

执行ob.a时,您会从int a对象获取变量ob,该对象是类B的对象。

但是,当您执行ob.get();时,您正在调用get()类的A - 方法,因为get()中没有B, - 正如您所写的那样 - 使用this.a,在这种情况下,这将是int a类的A

答案 2 :(得分:1)

不会覆盖变量。 ob.a 打印B类的变量。 ob.get() 在B类中搜索get方法。当它没有到达那里时,它会搜索父类并执行它。