gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:50:43 24 4
gpt4 key购买 nike

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

All member functions are polymorphic in Java by default. That meanswhen you call this.toString() Java uses dynamic binding to resolve thecall, calling the child version. When you access the member x, youaccess the member of your current scope (the father) because membersare 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com