请看下面的代码:
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
的变量(经典多态性)。现在我们调用方法addFive
,该方法已在类Polymorphism
中被覆盖。然后,我们从getter方法打印变量值,该方法在Polymorphism类中也已被覆盖。因此,我们得到的答案为10。但是当对公共变量a
进行SOP运算时,我们得到的答案为3!这怎么发生的?尽管引用变量类型是Foo,但是它引用的是Polymorphism类的对象。那么,为什么在打印
f.a
类时没有访问Polymorphism
导致a的值?请帮忙 最佳答案
这是因为您不能覆盖类变量。当访问一个类变量时,引用的类型而不是对象的类型决定了您将获得什么。
如果您在子类中删除了a的重新声明,那么我认为该行为将更加符合预期。