2

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

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();
    }
}
4

3 回答 3

6

不存在被覆盖的变量之类的东西。B实际上有两个名为 的实例变量a:一个是它声明的,另一个是它继承的。看到这个:

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

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

于 2015-09-02T10:40:29.150 回答
1

这样做时,您从对象中ob.a获取变量,该对象是类的对象。int aobB

但是,当您这样做时,您是从 classob.get();调用- 方法,因为没有in ,正如您所写的那样,它使用了 ,在这种情况下,这将是class 。get()Aget()Bthis.aint aA

于 2015-09-02T10:40:07.900 回答
1

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

于 2015-09-02T10:41:58.153 回答