加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:51:45 所属栏目:Java 来源:网络整理
导读:我在低级别了解静态(编译时)和动态(运行时)绑定是什么. 我在某种程度上理解为什么知道这一点很重要(例如,仿制上解决仿制药这一事实有助于解释你能做什么和不做什么等等). 我不明白为什么选择是以这种或那种方式进行的 – 例如,Java对重载方法使用静态绑定,对
我在低级别了解静态(编译时)和动态(运行时)绑定是什么.

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

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

解决方法

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

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

将帖子

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读