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

标签 java oop inheritance

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

All member functions are polymorphic in Java by default. That means when you call this.toString() Java uses dynamic binding to resolve the call, calling the child version. When you access the member x, you access the member of your current scope (the father) because members are not polymorphic.

当你在父类(super class)和子类中都有一些字段x,并在你的子类中覆盖toString时,当你在基类中调用以下内容时:

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

在开头链接的问题中列出的答案中,这样做的理由是当子类在其自己的范围内时,基类不“知道”子类,但是对于多态性,它是一回事:父类(super class)不知道子类的存在,但仍然调用子类的方法。那么 Java 到底做了什么使两者行为不同 - 一个在子类中使用动态绑定(bind)而一个保持父类(super class)的范围?

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

最佳答案

要实现子类型多态性,Java 需要跟踪调用哪个方法,这需要额外的开销。您可以通过将字段保持私有(private)并使用 getter 来实现某种“多态字段”(前者不是必需的,但这样做是明智的)。您可能有兴趣查看

  • 动态调用
  • 调用接口(interface)
  • 特别调用
  • 调用静态
  • 调用虚拟

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

关于java - 为什么 Java 字段不是多态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43407138/

相关文章:

php - 非线性数据库检索

Ruby:创建不可继承的类方法

java - 可以存储多种数据类型的变量

java - 我应该单独学习 JavaFX for Android 还是 Android

java - 在 Spring EL 中使用数组的内容

c++ - 指向类的指针

c# - 如何避免在变量赋值的情况下调用冗余?

swift - 返回 self 的类函数?对于核心数据抽象类

java - 由于无法通过引用传递,组织 Java 代码的最佳方式是什么?

java - 如何反序列化JSON到接口(interface)?