Java 中的向上转换和两个单独的对象属性



试图理解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"是AB中的每个字段

但是,是的,这里有两个单独的字段。这不像一个字段"覆盖"另一个字段或类似的东西。

目前尚不清楚您要实现的目标,但是A中的i宣言掩盖了B中的i宣言。有关更多信息,请参阅 Java 语言规范的第 6.4 节。

请注意,在几乎所有情况下,字段都应该是私有的 - 此时隐藏真的无关紧要,因为您不会尝试引用未在您正在编码的类中声明的变量。

这就是Java的工作方式。 您有两个字段"可用",它们恰好具有相同的名称。 当你从子类引用时,它隐藏了超类的版本,但它仍然存在。

相关内容

  • 没有找到相关文章

最新更新