我有以下代码:
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");
,结果将是“字符串版本”。为什么?为什么没有编译器错误?
答案 0 :(得分:23)
JAVA规范说,在这种情况下,将调用最具体的功能。由于String是Object的子类型 - 将调用第二个方法。 如果将Object更改为StringBuffer - 则没有特定的方法,因为StringBuffer不是String的子类型,反之亦然。在这种情况下,编译器不知道要调用哪个方法 - 因此错误。
答案 1 :(得分:1)
在查看其他案例时:
package 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");
}
}
如果第一个方法tqkes一个StringBuffer而第二个方法是一个String,那么就不会有混淆,因为“word”是一个String而不是一个StringBuffer。
在Java中,函数/方法的身份取决于3件事:名称,参数类型(也称参数签名)和类加载器。由于两种类型都有不同的参数签名,因此编译器可以轻松选择正确的参数,并且不会引发错误。