这个java代码的解释是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我有以下代码:

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”。为什么?为什么没有编译器错误?

提问于
用户回答回答于

JAVA规范说,在这种情况下,最具体的函数将被调用。由于String是Object的子类型 - 第二个方法将被调用。如果将Object更改为StringBuffer - 由于StringBuffer不是String的子类型,因此没有具体的方法,反之亦然。在这种情况下,编译器不知道调用哪个方法 - 因此是错误。

用户回答回答于

当看另一个案例时:

包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,第二个方法使用String,则不会出现混淆,因为“word”是字符串而不是StringBuffer。

在Java中,函数/方法的标识取决于3件事:名称,参数类型(即参数签名)和类加载器。由于这两种类型都有不同的参数签名,因此编译器可以轻松选择正确的参数并且不会引发错误。

扫码关注云+社区