为什么不能在编译时重写,但重载可以?

Zah*_*977 1 java overriding runtime

我知道重载是在编译时完成的,因为指定了参数的数量和类型,并且编译器知道对象中的哪一个方法被调用.

但是在重写为什么编译器不会看到子类是否存在于超类中?

如果编译器在编译时不知道类,那么它如何识别重载?

谢谢!

JB *_*zet 8

把自己放在编译器的脚下.想象一下,你必须编译以下方法:

public void foo(List<String> list) {
    System.put.println(list.size());
}
Run Code Online (Sandbox Code Playgroud)

你怎么可能知道具体类型list是什么,从而size()调用该方法的具体实现方式?它是一个ArrayList吗?一个LinkedList?一个CopyOnWriteArrayList?你无法知道.

如果您还不确定,该方法的调用者可以执行类似的操作

if (Math.random() > 0.5) {
    foo(new ArrayList<>());
}
else {
    foo(new LinkedList<>());
}
Run Code Online (Sandbox Code Playgroud)

在编译时无法知道列表的具体类型是什么.您只能在运行时知道.因此,size()调用哪个方法只能在运行时决定.

  • Java**编译器**就是这样做的.Java**运行时**根据列表的具体运行时类型选择要调用的具体方法(即ArrayList#size(),LinkedList#size()或WhateverOtherList#size()).这就是最重要的魔法发生的地方. (2认同)