我在低级别了解静态(编译时)和动态(运行时)绑定是什么.
我在某种程度上理解为什么知道这一点很重要(例如,仿制上解决仿制药这一事实有助于解释你能做什么和不做什么等等).
我不明白为什么选择是以这种或那种方式进行的 – 例如,Java对重载方法使用静态绑定,对重写方法使用动态绑定.这是为什么?它是一种设计选择吗?对于理解Java深层功能的人来说,它是否是显而易见且不可避免的事情,还是需要学习(而不是理解)的东西?
解决方法
问题是,在重写的情况下,编译器如何知道在编译期间调用哪个方法.你必须明白这一点,
List list = list.getAList(); list.add(whatever);
现在,假设getAList()方法可以根据某些条件返回任何几个List实现.因此,编译器如何知道返回了什么实现?以及要调用的add()方法.如您所见,这只能在运行时决定.然而,在重载不是这样的情况下,编译时一切都很清楚.我希望你现在明白这件事.
将帖子
将评论中的讨论引入实际答案.
直到运行时才能知道它.以这种方式理解它,特定类的实例化取决于用户提供的参数.现在告诉我编译器将如何知道用户将传递哪个参数,以及显然要实例化的类.或者更容易,回答这个问题,编译器将如何知道流是否会传递给if或者阻塞?或者您认为我们为什么检查和运行时异常?以零除的情况为例;例如n / m,其中m因某些计算而变为0.在这种情况下,显而易见的是编译器无法说会出现ArithmeticException,因为m是不知道的.由于所有这些信息在编译时都不可用,因此编译器类似地不知道哪个方法将覆盖哪个.