请看下面的代码:
class Foo {
public int a;
public Foo() {
a = 3;
}
public void addFive() {
a += 5;
}
public int getA() {
System.out.println("we are here in base class!");
return a;
}
}
public class Polymorphism extends Foo{
public int a;
public Poylmorphism() {
a = 5;
}
public void addFive() {
System.out.println("we are here !" + a);
a += 5;
}
public int getA() {
System.out.println("we are here in sub class!");
return a;
}
public static void main(String [] main) {
Foo f = new Polymorphism();
f.addFive();
System.out.println(f.getA());
System.out.println(f.a);
}
}这里我们将类Polymorphism的对象引用赋值给Foo类型的变量,典型的多态。现在我们调用已在类Polymorphism中重写的方法addFive。然后,我们打印来自getter方法的变量值,该方法也已在类多态性中被覆盖。所以我们得到的答案是10。但是当公共变量a为SOP时,我们得到的答案是3!
怎么会出这事?即使引用变量类型是Foo,但它引用的是多态类的对象。那么,为什么访问f.a不会导致Polymorphism类中的a的值被打印出来呢?请帮帮忙
发布于 2012-09-16 19:32:09
这是因为你不能重写类变量。在访问类变量时,决定您将获得什么的是引用的类型,而不是对象的类型。
如果在子类中去掉a的重声明,那么我假设行为会更符合预期。
发布于 2012-09-16 19:31:05
你隐藏了Polymorphism的a --你应该为此得到一个编译器警告。因此,这是两个截然不同的a字段。与方法不同,字段不能是虚的。好的做法是根本不使用公共字段,而只使用改变私有状态的方法(封装)。
如果你想让它成为虚拟的,你需要用访问器方法把它变成一个属性(例如你已经拥有的:getA)。
https://stackoverflow.com/questions/12446472
复制相似问题