我有以下代码:
public class Main {
public void method(Object o)
{
System.out.println("Object Version");
}
public void method(String s)
{
System.out.println("String Version");
}
public static void main(String args[])
{
Main question = new Main();
question.method(null);//1
}
}
为什么结果是"String Version“?如果第一个方法接受StringBuffer
对象,为什么会出现编译器错误?
另一种情况:如果第一个方法接受一个StringBuffer
对象,并且我编写了question.method("word");
,结果将是"String Version“。为什么?为什么没有编译器错误?
发布于 2010-06-14 03:38:34
JAVA规范规定,在这种情况下,将调用最具体的函数。由于String是Object的子类型,因此将调用第二个方法。如果将Object更改为StringBuffer,则没有特定的方法,因为StringBuffer不是String的子类型,反之亦然。在这种情况下,编译器不知道调用哪个方法-因此出现错误。
发布于 2010-06-14 04:01:14
在查看另一个案例时:
打包com.snamellit;
public class Main {
public void method(Object o) {
System.out.println("Object Version");
}
public void method(String s) {
System.out.println("String Version");
}
public static void main(String args[]) {
Main question = new Main();
question.method("word");
}
}
如果第一个方法调用一个单词,第二个方法调用一个字符串,那么就不会出现混淆,因为“StringBuffer”是一个字符串而不是一个StringBuffer。
在Java中,函数/方法的标识依赖于3件事:名称、类型、参数(也称为参数签名)和类加载器。因为这两种类型都有不同的参数签名,所以编译器可以很容易地选择正确的签名,并且不会引发错误。
https://stackoverflow.com/questions/3033607
复制相似问题