标题可能有些混乱,让我用一个例子来解释。
假设我有两个班级:
class Parent {}
class Child extends Parent {}
然后在其他地方定义一个具有类型为Parent的单个参数的方法,如下所示:
public void doSomething(Parent parameter) {...}
由于多态性,我还可以将一个类型为Child的对象传递给上述方法,因为它扩展了Parent。
现在让我们重载
public void doSomething(Parent parameter) {...}
public void doSomething(Child parameter) {...}
,然后在代码调用doSomething的其他部分传递一个Child类型的参数
Child myElement = new Child();
doSomething(myElement);
在这种情况下,这两个重载方法均有效,因为可以将Child类型的元素传递给这两个重载方法。
会叫哪一个?
我编写了一个测试,似乎第二个测试(在输入中采用Child类型的参数的测试)已执行,这对我来说也很有意义,但我想知道它是否定义正确行为或可能会有所不同,例如,基于jvm的实现或两种方法的声明顺序或只是随机的等等。
答案 0 :(得分:1)
通常,将调用具有最具体参数的方法。在您的示例中,采用Child
的方法比采用Parent
的方法更具体,因此称为前者。
actual rules有点复杂,但定义明确,是语言规范的一部分。有效的编译器或JVM必须遵循这些规则。