Upcasting in Java and two separate object properties

时光怂恿深爱的人放手 提交于 2020-01-23 17:00:00

问题


Trying to understand upcasting in Java. Recently observed strange behavior.

Example:

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

Seems, that upcasted object has two separate "i" properties. One "i" accessible directly (a.i) and the other through methods of child class (a.printI()).

Looks like upcasted object gets properties from superclass and methods from child class.

How object can have two separate "i"s?!


回答1:


Seems, that upcasted object has two separate "i" properties.

Firstly, it's worth being clear about terminology. There's no such thing as an "upcasted object" - and "i" is a field in each of A and B.

But yes, there are two separate fields here. It's not like one field "overrides" another or anything like that.

It's not clear what you were trying to achieve, but the declaration of i in A shadows the declaration of i in B. See section 6.4 of the Java Language Specification for more information.

Note that in almost all cases, fields should be private - at which point the hiding really doesn't matter, as you wouldn't try to refer to a variable which wasn't declared in the class you're coding in anyway.




回答2:


That's how Java works. You have both fields "available", they just happen to have the same name. When you reference from the subclass, it is hiding the superclass' version, but it is still there.



来源:https://stackoverflow.com/questions/10653845/upcasting-in-java-and-two-separate-object-properties

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!