0

请看一下这段代码:

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已在 class 中覆盖的方法Polymorphism。然后我们从一个 getter 方法打印变量值,该方法在类多态性中也被覆盖。所以我们得到答案为 10。但是当公共变量a被 SOP'ed 时,我们得到答案 3!

这怎么发生的?即使引用变量类型是 Foo 但它指的是多态类的对象。那么为什么访问f.a不会导致类中的 a 值Polymorphism被打印出来呢?请帮忙

4

2 回答 2

5

你隐藏了a-Polymorphism你实际上应该得到一个编译器警告。因此,这是两个不同的a领域。与方法相反,字段不能是虚拟的。好的做法是根本没有公共领域,而只有改变私有状态的方法(封装)。

如果你想把它变成虚拟的,你需要用访问器方法把它变成一个属性(例如你有什么:)getA

于 2012-09-16T11:31:04.797 回答
2

这是因为您不能覆盖类变量。当访问一个类变量时,引用的类型,而不是对象的类型,决定了你会得到什么。

如果您在子类中删除 a 的重新声明,那么我认为行为会更符合预期。

于 2012-09-16T11:32:08.673 回答