我在看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
字段来自子类。
答案 0 :(得分:1)
要实现子类型多态,Java需要跟踪要调用的方法,它需要额外的开销。你可以通过保持字段私有和使用getter来实现一种“多态字段”(前者不是必需的,但是很明智)。您可能有兴趣查看
呼叫。您可以在这里阅读更多相关信息: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokevirtual