请考虑以下代码。
class Base {
int i = 99;
public void amethod() {
System.out.println("Base.amethod()");
}
Base() {
this.amethod();
}
}
public class Derived extends Base {
int i = -1;
public static void main(String argv[]) {
Derived b; // here if we use **Base b;** below mentioned println() prints 99
b = new Derived();
System.out.println(b.i);
b.amethod();
}
public void amethod() {
System.out.println("Derived.amethod()");
}
}
输出
Derived.amethod()
-1 (99 when reference variable is of Base type)
Derived.amethod()
现在我的问题是
由于我只使用一个'new'关键字,因此只会创建一个对象(这将是Derived和基类的实例),此对象将具有名为i的单个实例变量,其值应相同(我认为)是否使用Base类ref var或Derived class ref var引用它。如何通过更改引用变量声明(从Derived到Base)来改变这个i的值,因为我没有更改堆中的任何对象获取的内容存储。
希望我明白我的问题。
答案 0 :(得分:3)
有一个对象,是的,但它有两个名为i
的成员。基本上Derived
中的那个会影响Base
中的那个。成员访问权限不是多态的 - 它指的是与指向对象的引用相关的类型的确切成员。
答案 1 :(得分:1)
当您实例化Derived
时,您实际上会有两个名为' i'的类字段。但是,一个将Base.i
,另一个Derived.i
派生字段将隐藏基本字段,除非您看到,您的派生被视为基础