public class Overloading {
public static void main(String[] args) {
Overloading o = new Overloading();
o.display(null);
}
void display(String s) {
System.out.println("String method called");
}
void display(Object obj) {
System.out.println("Object method called");
}
}
它将输出作为“String方法调用”。我需要解释原因吗?
答案 0 :(得分:5)
取自Java Spec:
如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符。 Java编程语言使用选择最具体方法的规则。
首先:两种方法都可以访问(显然)并且适用。它们都适用,因为null
的类型为nulltype
,根据定义,它是所有类型的子类型。 String
比Object
更具体,因为String extends Object
。如果您要添加以下内容,则会遇到问题,因为Integer
和String
同样具有“特定”:
void display(Integer s) {
System.out.println("Integer method called");
}
答案 1 :(得分:4)
Java总能找到最具体的方法版本。
String
扩展Object
,因此更具体。
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5