我正在看
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.
如果在超类和子类中都有一个字段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字段.
最佳答案 要实现子类型多态,Java需要跟踪要调用的方法,这需要额外的开销.你可以通过保持字段私有和使用getter来实现一种“多态字段”(前者不是必需的,但是很明智).您可能有兴趣退房
> invokedynamic
>调用接口
> invokespecial
> invokestatic
> invokevirtual
调用.您可以在这里阅读更多相关信息:
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokevirtual