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

时间:2010-12-06 05:46:59

标签: java language-design

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

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

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

3 个答案:

答案 0 :(得分:3)

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

List list = list.getAList();
list.add(whatever);

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

<强> [编辑]

将评论中的讨论带到实际答案中。

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

答案 1 :(得分:1)

动态绑定适用于覆盖方法时,因为它需要在运行时根据对象的运行时类型决定执行哪个方法(代码)。使用重载方法,您无需在运行时决定,您可以在编译时找出将被调用的方法。这将导致更快的执行。

答案 2 :(得分:0)

根据我的说法,我猜这是出于明显的原因...... 重载是complilor在complile time期间理解的事情,overriding是后期绑定或运行时.... 了解OOP概念可能对您有所帮助..