在这段代码中,我只分配一个对象,但在某种程度上,我存储了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());
}
}
答案 0 :(得分:3)
一个x
属于超类,另一个属于子类。它们具有相同名称的事实并不重要,您可以通过使用类限定访问表达式来访问它们:
((Base)b).x
((Subclass)b).x
(请注意,第一行中的强制转换不是必需的;我已将其置于对称中)
答案 1 :(得分:0)
在java中,你不能重载variables
。虽然它们具有相同的名称,但它们的类是不同的。
答案 2 :(得分:0)
根据这个tutorial
(在“你能在子类中做什么”一节),当你在子类中声明一个与超类中的字段同名的字段时,在这种情况下{{1超类中的那个将被隐藏,这意味着子类中实际上有两个x
,一个用于自身,另一个用于其超类,只有同名的x
。您可以使用x
引用派生类中的一个,使用derivedObject.x
引用子类中的那个(如果在派生类中,则引用super.x)