使用null参数的意外重载方法编译器选择

时间:2016-04-20 06:10:47

标签: java overloading scjp

我很惊讶为什么输出与我期望的非常不同,我有两个重载方法,一个有一个String而另一个是Object作为参数,同时用null参数调用这个方法,输出只是打印 "String" 而不是调用具有对象作为参数的方法。

为什么Java选择具有String作为参数的方法,java如何确定要调用哪个重载方法?

class TestingClass {
    public void test(String s) {
        System.out.println("String");
    }

    public void test(Object o) {
        System.out.println("Object");
    }

    public static void main(String[] args) {
        TestingClass q = new TestingClass();
        q.test(null);
    }
}

2 个答案:

答案 0 :(得分:2)

此代码中没有覆盖,只有方法重载。当编译器必须选择执行两个test方法中的哪一个时(因为null可以传递给两者),它会选择具有更具体参数类型的方法 - test(String s) - { {1}}比String更具体,因为它是Object的子类。

可以使用以下方法调用另一种方法:

Object

答案 1 :(得分:0)

如果不添加可能的新答案,请允许我建议您扩展代码,如下所示

public class Overload {

    public static void main(String[] args) {
        new Overload().test(null);
    }

    public void test(String s) {
        System.out.println("String");
    }

    public void test(Object o) {
        System.out.println("Object");
    }

    public void test(Integer s) {
        System.out.println("Integer");
    }

}

注释掉任何一个Object或Integer版本,任何人都可以自己查看。答案已由其他人提供。