方法重载包括父类和子类

时间:2018-04-15 11:28:50

标签: java object java-7 overloading

为什么以下代码会打印"string"?为什么没有错误,因为方法调用不明确?

class Mixer {
    void print(String s) {
        System.out.println("string");
    }

    void print(Object o) {
        System.out.println("object");
    }


    public static void main(String[] args) {
        Mixer m = new Mixer();
        m.print(null);
    }
}

1 个答案:

答案 0 :(得分:1)

说明

选择String - 方法是因为它是这些类型的最具体

由于两种方法都可访问适用 Java选择最具体的,这在 Java语言中有所描述规范详细。

请参阅JLS§15.12.2说明:

  

可能有多个这样的方法,在这种情况下,选择最具体的。最具体方法的描述符(签名加返回类型)是在运行时用于执行方法调度的方法。

JLS§15.12.2.5列出了用于确定最具体的方法的所有规则。

实施例

看看以下方法:

public void foo(Object o) { ... }
public void foo(AbstractCollection<String> o) { ... }
public void foo(AbstractList<String> o) { ... }
public void foo(ArrayList<String> o) { ... }

对于每种方法,指定的类型都会更具体,如果您提供ArrayListnull,它将首先使用最低的方法。