对这个简单的多态性例子感到困惑

Sha*_*s88 0 java polymorphism

请看一下这段代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我们将类的对象的引用分配给Polymorphism类型的变量Foo,经典的polmorphism.现在我们调用addFive已在类中重写的方法Polymorphism.然后我们从getter方法中打印变量值,该方法也已在类Polymorphism中被覆盖.所以我们得到答案为10.但是当公共变量a是SOP时我们得到答案3 !!

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

Luc*_*ero 5

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

如果要将其设置为虚拟,则需要将其设置为具有访问器方法的属性(例如,您拥有的内容:) getA.

  • @ Shades88,查找虚拟字段意味着执行"getter"代码.字段是对象数据中的偏移量,而方法独立于实际对象数据; 它们的地址存储在一个虚拟方法表中,每个类只存在一次.方法只是传递给指向对象数据的指针,它们不是数据的一部分.请注意,只要字段是私有的,无论如何这都变得无关紧要,因为除了声明字段的类的方法之外,没有其他代码可以看到它. (2认同)