0

在这段代码中,我只分配了一个对象,但以某种方式我存储了 x 的 2 个副本(一个用于基类,一个用于子类)。如果对象只有一个,这怎么可能?存储两个 x 变量的空间在哪里?这是否意味着实际上创建了两个对象?

class App {

    class Base {
        public int x;

        public Base() {
            x = 2;
        }

        int method() {
            return x;
        }
    }

    class Subclass extends Base {
        public int x;

        public Subclass() {
            x = 3;
        }

        int method() {
            return x;
        }
    }

    public static void main(String[] args) {
        new App().run();
    }

    public void run() {
        Base b = new Subclass();
        System.out.println(b.x);
        System.out.println(b.method());
    }
}
4

3 回答 3

3

一个x属于超类,另一个属于子类。它们具有相同名称这一事实并不重要,您可以通过使用类限定访问表达式来访问两者:

((Base)b).x
((Subclass)b).x

(请注意,第一行中的演员表是不必要的;我把它放进去是为了对称)

于 2013-08-03T11:00:23.263 回答
0

根据这个tutorial(在“你可以在子类中做什么”一节中),当你在子类中声明一个与超类中同名的字段时,在这种情况下x,超类中的那个将被隐藏,这意味着x子类中实际上有两个 s,一个为自身,另一个为其超类,仅具有相同的 name x。您可以引用派生类中derivedObject.x的一个 using 和子类中的一个 using ((Base)derivedObject).x(或 super.x 如果在派生类中)

于 2013-08-03T11:16:51.387 回答
0

在java中你不能重载variables。,虽然它们同名,但它们的类是不同的。

于 2013-08-03T11:03:34.637 回答