为什么Java字段不是多态的?

时间:2017-04-14 07:27:41

标签: java oop inheritance

我在看this答案,我不明白为什么方法会是多态的而不是字段的逻辑。

  

默认情况下,所有成员函数在Java中都是多态的。这意味着   当你调用this.toString()时,Java使用动态绑定来解析   打电话,打电话给孩子版。当您访问成员x时,您   访问您当前范围的成员(父亲),因为成员   不是多态的。

如果在超类和子类中都有一个字段x,并在子类中覆盖toString,则在基类中调用以下内容时:

System.out.println(this); //calls the subclass's toString implementation
System.out.println(this.x) //prints the base class's x field

在开头链接的问题中列出的答案中对此的理由是,基类在它自己的范围内时并不“知道”子类,但是在多态性的情况下,它是相同的:超类不知道子类存在,但仍然调用子类方法。那么Java究竟做了什么让两者行为不同 - 一个在子类中使用动态绑定而另一个在超类的范围内?

编辑:澄清一下,我坚持为什么this.x会做多边形的事情,查看对象的实际类型,而不仅仅是引用类型,并打印x字段来自子类。

1 个答案:

答案 0 :(得分:1)

要实现子类型多态,Java需要跟踪要调用的方法,它需要额外的开销。你可以通过保持字段私有和使用getter来实现一种“多态字段”(前者不是必需的,但是很明智)。您可能有兴趣查看

  • invokedynamic
  • invokeinterface
  • invokespecial
  • invokestatic
  • invokevirtual

呼叫。您可以在这里阅读更多相关信息: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokevirtual