为什么输出在以下情况下会有所不同,即使该变量已被覆盖?
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();
}
}
答案 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方法。当它没有到达那里时,它会搜索父类并执行它。