Java重载一个具有param的方法的方法会发生什么,该方法是从其他方法获取的param的子类型?

时间:2018-12-19 16:01:07

标签: java parent-child overloading parent

标题可能有些混乱,让我用一个例子来解释。
假设我有两个班级:

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的实现或两种方法的声明顺序或只是随机的等等。

1 个答案:

答案 0 :(得分:1)

通常,将调用具有最具体参数的方法。在您的示例中,采用Child的方法比采用Parent的方法更具体,因此称为前者。

actual rules有点复杂,但定义明确,是语言规范的一部分。有效的编译器或JVM必须遵循这些规则。