我只是尝试了一些示例代码来检查Java中的类变量覆盖行为。以下是代码:
class A{
int i=0;
void sayHi(){
System.out.println("Hi From A");
}
}
class B extends A{
int i=2;
void sayHi(){
System.out.println("Hi From B");
}
}
public class HelloWorld {
public static void main(String[] args) {
A a= new B();
System.out.println("i->"+a.i); // this prints 0, which is from A
System.out.println("i->"+((B)a).i); // this prints 2, which is from B
a.sayHi(); // method from B gets called since object is of type B
}
}
我无法理解下面这两行发生的事情
System.out.println("i->"+a.i); // this prints 0, which is from A
System.out.println("i->"+((B)a).i); // this prints 2, which is from B
为什么a.i
打印0
即使对象属于B
类型?为什么在将其投放到2
之后打印B
?
答案 0 :(得分:4)
i
不是方法 - 它是数据成员。数据成员不会覆盖,他们隐藏。因此,即使您的实例是B
,它也有两个数据成员 - 来自i
的{{1}}和来自A
的{{1}}。当您通过i
引用引用它时,您将获得前者,当您使用B
引用时(例如,通过明确地将其引用),您将获得后者。
实例方法的行为有所不同。无论引用的类型如何,因为实例是A
实例,您将获得多态行为并打印字符串B
。
答案 1 :(得分:2)
即使A被初始化为新的B(),如果你说
,变量也是A.B a = new B();
你不会有这个问题。