我在测验中遇到了这个问题,
public class MoneyCalc {
public void method(Object o) {
System.out.println("Object Verion");
}
public void method(String s) {
System.out.println("String Version");
}
public static void main(String args[]) {
MoneyCalc question = new MoneyCalc();
question.method(null);
}
}
Run Code Online (Sandbox Code Playgroud)
该程序的输出是"String Version".但是我无法理解为什么将null传递给重载方法会选择字符串版本.null是一个String变量,指向什么?
但是当代码更改为时,
public class MoneyCalc {
public void method(StringBuffer sb) {
System.out.println("StringBuffer Verion");
}
public void method(String s) {
System.out.println("String Version");
}
public static void main(String args[]) {
MoneyCalc question = new MoneyCalc();
question.method(null);
}
}
Run Code Online (Sandbox Code Playgroud)
它给出了一个编译错误,说"方法方法(StringBuffer)对于MoneyCalc类型是不明确的"
Jon*_*eet 102
null是一个String变量,指向什么?
可以将空引用转换为任何类类型的表达式.所以在这种情况下String
,这很好:
String x = null;
Run Code Online (Sandbox Code Playgroud)
String
选择此处的重载是因为Java编译器根据JLS的第15.12.2.5节选择最具体的重载.特别是:
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体.
在第二种情况下,两种方法仍然适用,但既不是String
也不StringBuffer
比另一种更具体,因此两种方法都不比另一种方法更具体,因此编译器错误.
此外,JLS 3.10.7还声明"null"是"null类型"的文字值.因此存在一种称为"null"的类型.
稍后,JLS 4.1声明存在一个无法声明变量的null类型,但您只能通过null文本使用它.后来它说:
null引用总是可以进行任何引用类型的扩展引用转换.
为什么编译器选择将它扩展为String可能会在Jon的答案中解释.
归档时间: |
|
查看次数: |
11966 次 |
最近记录: |