java验证中的数据绑定

java验证中的数据绑定,java,polymorphism,Java,Polymorphism,我是java初学者。我编写了以下代码 class SuperA{ Integer a = 1; protected void f(){ System.out.println("in superA"); } } class Test extends SuperA{ Integer a = 2; protected void f(){ System.out.println("in test"); } public static void main(St

我是java初学者。我编写了以下代码

class SuperA{
  Integer a = 1;
  protected void f(){
    System.out.println("in superA");
  }
}

class Test extends SuperA{
  Integer a = 2;
  protected void f(){
    System.out.println("in test");
  }

  public static void main(String... args) throws Exception{   

    SuperA o = new Test();
    o.f();
    System.out.println("a = "+o.a);
  }
}
输出:在测试中

a=1

我知道为什么它是测试中的
,但我不明白为什么
a=1
。我想应该是
a=2


多态性中调用方法和数据的区别是什么?我建议您这样做:

class SuperA {
  protected Integer a = 1;

  protected void f() {
    System.out.println("in superA");
  }
}

class Test extends SuperA {
  private static final Integer DEFAULT_A = 2;

  public Test() {
    super(DEFAULT_A);
  }

  protected void f(){
    System.out.println("in test");
  }
}


您的
Test
类拥有两个名为
a
的独立实例变量。它们可以通过以下方式访问:

this.a


这使得它们不同于方法,其中
Test
中定义的
f(),因此,
Test
没有超类版本。

运行时多态性不适用于数据变量,即在您的情况下a,因此当您尝试打印o.a时,它将检查SuperA的参考变量类型,在这种情况下,o/p将是1而不是2。
请按链接查看详细信息-->

否。我不想解决此问题,但只想知道堆栈上的对象和堆之间的映射是如何完成的。一些较低的视图。所以您是说只覆盖行为而不覆盖数据?覆盖数据毫无意义:无论如何,您不能通过覆盖它来更改任何内容。
class Test extends SuperA{
  Integer a = 2;
this.a
((SuperA)this).a