我在测验中遇到了这个问题,
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); } }
该程序的输出为“字符串版本”。但是我不明白为什么将null传递给重载方法会选择字符串版本。字符串变量null是否指向空?
但是,当代码更改为
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); } }
它给出了一个编译错误,指出“对于MoneyCalc类型,方法method(StringBuffer)是不明确的”
字符串变量null是否指向空?
空引用可以转换为任何类类型的表达式。因此,对于String,这很好:
String
String x = null;
String选择此处的重载是因为Java编译器根据JLS的15.12.2.5节选择了最具体的重载。尤其是:
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而没有编译时类型错误,则一个方法比另一个方法更具体。
在第二种情况下,这两种方法仍然适用,但是两者String都不StringBuffer比另一个更具体,因此这两个方法都不比另一个更具体,因此会出现编译器错误。
StringBuffer