class Base
{
int i = 99;
public void amethod()
{
System.out.println("Base.amethod()");
}
Base()
{
amethod();
}
}
public class Derived extends Base
{
int i = -1;
public static void main(String argv[])
{
Base b = new Derived();
System.out.println(b.i);
b.amethod();
}
public void amethod()
{
System.out.println("Derived.amethod()");
}
}为什么这段代码打印b.i = 99而不是b.i = -1?谢谢。
发布于 2011-03-14 02:23:28
这是因为您引用的是对象的成员变量,而不是方法。因为它被声明为Base对象,所以它将使用Base.i,因为成员变量不能从提供给方法的多态性中受益。如果您将getI()方法添加到这两个类并调用它,而不是只调用b.i,那么它将按照您的预期工作。
public int getI() {
return this.i;
}
Base b = new Derived();
System.out.println(b.getI());发布于 2011-03-14 02:19:43
您有两个名为i的不同字段;一个在Base中,另一个在Derived中。
因为b被声明为Base,所以b.i从Base类返回i字段。
您可能希望在Derived构造函数中设置i字段,而不是创建新字段。
发布于 2011-03-14 02:20:23
因为在本例中,b.i说的是(( Base ).i),这意味着它将引用Base的i变量,而不是派生的i。如果您使用的是b.getI(),并且每个Base和Dervid都实现了自己的getI并返回自己的i,那么它将返回-1。
来解释为什么Base调用派生的amethod。Java方法调用是动态的,并在运行时确定。在您的例子中,这里的Base b = new Derived() b的类型是派生的。Java运行时将实现b的类型,并调用最接近于派生的方法。
所以如果你有
class Base{
int i =99;
public int getI(){
return i;
}
}
class Derived extends Base{
int i =-1;
public int getI(){
return i;
}
}派生的getI()方法将被调用(并返回-1),即使它被定义为Base b = new Derived();
https://stackoverflow.com/questions/5291378
复制相似问题