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

JDe*_*age 7 java language-design

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

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

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

Ade*_*ari 3

问题是,在重写的情况下,编译器如何知道在编译时调用哪个方法。你必须明白这一点,

List list = list.getAList();
list.add(whatever);
Run Code Online (Sandbox Code Playgroud)

现在,假设方法可以根据某些标准getAList()返回多个实现中的任何一个。List因此,编译器如何知道返回了什么实现?以及add()调用哪个方法。正如你所看到的,这只能在运行时决定。然而,在重载中情况并非如此,并且一切在编译时都清楚。我希望你现在明白了。

[编辑]

将评论中正在进行的讨论带到实际答案中。

直到运行时才能知道。这样理解,特定类的实例化取决于用户提供的参数。现在告诉我编译器如何知道用户将传递哪个参数,以及显然要实例化哪个类。或者更简单,回答这个问题:编译器如何知道流将被传递到if块还是else块?或者你认为为什么我们有检查异常和运行时异常?divide-by-zero以;为例:例如n/m,其中m成为0某些计算的结果。在这种情况下,很明显编译器不能说会有一个,ArithmeticException因为m不能立即知道。由于所有这些信息在编译时不可用,因此编译器同样不知道哪个方法将覆盖哪个方法。