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

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

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

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

解决方法

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

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

将帖子

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

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

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...