上溯造型在Java和两个独立的对象属性(Upcasting in Java and two sepa

2019-09-17 08:36发布

想了解上溯造型在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

似乎,该upcasted对象具有两个分开的“i”的性质。 一个“我”直接访问(AI)和其他通过子类的方法(a.printI())。

貌似upcasted对象会从子类从超类的属性和方法。

对象怎么能有两个不同的“我” S?

Answer 1:

似乎,该upcasted对象具有两个分开的“i”的性质。

首先,它的价值是明确的术语。 有作为“upcasted对象”没有这样的事-和“i”是在每一个字段 AB

但是,是的,这里有两个不同的领域。 它不象一个领域的“覆盖”另一个或类似的东西。

目前还不清楚是什么你达到的,但宣言iA 阴影的声明iB 。 见Java语言规范的第6.4节以获取更多信息。

请注意,在几乎所有情况下,场应该是私有的 - 在这一点隐藏其实并不重要,因为你不会尝试指的是不是在你反正编码类中声明的变量。



Answer 2:

这就是Java的是如何工作的。 你有两个字段“可用”,他们只是碰巧有相同的名称。 当您从子类引用,它是隐藏的超类版本,但它仍然是存在的。



文章来源: Upcasting in Java and two separate object properties