存储两个具有相同名称的变量的对象

时间:2013-08-03 10:59:10

标签: java

在这段代码中,我只分配一个对象,但在某种程度上,我存储了2个x副本(一个用于基类,一个用于子类)。如果对象只有一个怎么可能呢?找到存放两个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());
    }
}

3 个答案:

答案 0 :(得分:3)

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

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

(请注意,第一行中的强制转换不是必需的;我已将其置于对称中)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

根据这个tutorial(在“你能在子类中做什么”一节),当你在子类中声明一个与超类中的字段同名的字段时,在这种情况下{{1超类中的那个将被隐藏,这意味着子类中实际上有两个x,一个用于自身,另一个用于其超类,只有同名的x 。您可以使用x引用派生类中的一个,使用derivedObject.x引用子类中的那个(如果在派生类中,则引用super.x)