方法重载,包括父子方法 class
Method overloading including parent and child class
为什么下面的代码会打印"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);
}
}
说明
选择 String
方法是因为它是这些类型中最具体的。
因为这两种方法都可访问并且适用 Java 选择最具体,这在Java语言规范中有详细描述。
请参阅 JLS§15.12.2 内容:
There may be more than one such method, in which case the most specific one is chosen. The descriptor (signature plus return type) of the most specific method is one used at run time to perform the method dispatch.
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) { ... }
对于每种方法,指定的类型都会更具体,如果您给出ArrayList
或null
,它将因此首先使用最低的方法。
为什么下面的代码会打印"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);
}
}
说明
选择 String
方法是因为它是这些类型中最具体的。
因为这两种方法都可访问并且适用 Java 选择最具体,这在Java语言规范中有详细描述。
请参阅 JLS§15.12.2 内容:
There may be more than one such method, in which case the most specific one is chosen. The descriptor (signature plus return type) of the most specific method is one used at run time to perform the method dispatch.
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) { ... }
对于每种方法,指定的类型都会更具体,如果您给出ArrayList
或null
,它将因此首先使用最低的方法。