1

试图理解 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”可以直接访问(ai),另一个通过子类的方法访问(a.printI())。

看起来向上转换的对象从超类获取属性,从子类获取方法。

对象怎么可以有两个单独的“i”?!

4

2 回答 2

5

似乎,该向上转换的对象具有两个单独的“i”属性。

首先,有必要明确术语。没有“向上转换的对象”之类的东西 - 并且“i”是每个and中的一个字段AB

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

目前尚不清楚您达到什么目的,但in的声明掩盖i了in的声明。有关详细信息,请参阅Java 语言规范的第 6.4 节A iB

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

于 2012-05-18T13:51:16.057 回答
1

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

于 2012-05-18T13:50:33.513 回答