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

Oro*_*102 1 java oop upcasting

试图理解Java中的upcasting.最近发现奇怪的行为.

例:

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
Run Code Online (Sandbox Code Playgroud)

似乎,upcasted对象有两个独立的"i"属性.一个"i"可以直接访问(ai),另一个通过子类(a.printI())的方法访问.

看起来像upcasted对象从超类和子类的方法获取属性.

对象如何拥有两个独立的"我"?!

Jon*_*eet 5

似乎,upcasted对象有两个独立的"i"属性.

首先,值得明确术语.没有"upcasted object"这样的东西 - 而"i"是每个和中的一个字段.AB

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

目前还不清楚是什么你达到的,但宣言iA 阴影的声明iB.有关更多信息,请参见Java语言规范的第6.4节.

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