微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何理解behvior是否会在Java中使用静态或动态绑定?

我在低级别了解静态(编译时)和动态(运行时)绑定是什么.

我在某种程度上理解为什么知道这一点很重要(例如,仿制上解决仿制药这一事实有助于解释你能做什么和不做什么等等).

我不明白为什么选择是以这种或那种方式进行的 – 例如,Java对重载方法使用静态绑定,对重写方法使用动态绑定.这是为什么?它是一种设计选择吗?对于理解Java深层功能的人来说,它是否是显而易见且不可避免的事情,还是需要学习(而不是理解)的东西?

解决方法

问题是,在重写的情况下,编译器如何知道在编译期间调用哪个方法.你必须明白这一点,
List list = list.getAList();
list.add(whatever);

现在,假设getAList()方法可以根据某些条件返回任何几个List实现.因此,编译器如何知道返回了什么实现?以及要调用的add()方法.如您所见,这只能在运行时决定.然而,在重载不是这样的情况下,编译时一切都很清楚.我希望你现在明白这件事.

将帖子

评论中的讨论引入实际答案.

直到运行时才能知道它.以这种方式理解它,特定类的实例化取决于用户提供的参数.现在告诉我编译器将如何知道用户将传递哪个参数,以及显然要实例化的类.或者更容易,回答这个问题,编译器将如何知道流是否会传递给if或者阻塞?或者您认为我们为什么检查和运行时异常?以零除的情况为例;例如n / m,其中m因某些计算而变为0.在这种情况下,显而易见的是编译器无法说会出现ArithmeticException,因为m是不知道的.由于所有这些信息在编译时都不可用,因此编译器类似地不知道哪个方法将覆盖哪个.

原文地址:https://www.jb51.cc/java/129902.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐