这个java代码有什么解释?

时间:2010-06-13 19:34:58

标签: java

我有以下代码:

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");,结果将是“字符串版本”。为什么?为什么没有编译器错误?

2 个答案:

答案 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件事:名称,参数类型(也称参数签名)和类加载器。由于两种类型都有不同的参数签名,因此编译器可以轻松选择正确的参数,并且不会引发错误。