试图理解Java中的向上转换。最近观察到的奇怪行为。
例:
public class A extends B {
public int i = 2;
public void printI() {
System.out.println("print i = " + this.i);
}
public static void main(String[] args) {
B a = new A(); // <- upcasting here
System.out.println("i = " + a.i);
a.printI();
}
}
class B {
public int i = 1;
public void printI() {}
}
//Output:
//i = 1
//print i = 2
似乎,向上转换的对象有两个单独的"i"属性。一个"i"可直接访问(a.i(,另一个通过子类的方法(a.printI(((访问。
看起来向上转换的对象从超类获取属性,从子类获取方法。
对象怎么能有两个独立的"i"?!
似乎,向上转换的对象有两个单独的"i"属性。
首先,术语值得明确。没有"向上投射的对象"这样的东西 - "i"是A
和B
中的每个字段。
但是,是的,这里有两个单独的字段。这不像一个字段"覆盖"另一个字段或类似的东西。
目前尚不清楚您要实现的目标,但是A
中的i
宣言掩盖了B
中的i
宣言。有关更多信息,请参阅 Java 语言规范的第 6.4 节。
请注意,在几乎所有情况下,字段都应该是私有的 - 此时隐藏真的无关紧要,因为您不会尝试引用未在您正在编码的类中声明的变量。
这就是Java的工作方式。 您有两个字段"可用",它们恰好具有相同的名称。 当你从子类引用时,它隐藏了超类的版本,但它仍然存在。