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

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

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

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

解决方法

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

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

将帖子

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

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

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...