请看下面的代码:

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的重新声明,那么我认为该行为将更加符合预期。

10-08 10:52