java - 使用 null 参数进行意外重载方法编译器选择

标签 java overloading scjp

我很惊讶为什么输出与我期望的有很大不同,我有两个重载方法,一个有一个字符串,另一个有一个对象作为参数,当使用空参数调用此方法时,输出只是打印 "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);
    }
}

最佳答案

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

可以使用以下方式调用另一个方法:

q.test((Object) null);

关于java - 使用 null 参数进行意外重载方法编译器选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36735188/

相关文章:

java - 客户端 VM 没有内联?

java - 获取帧动画 libgdx java 中的特定行

Asp.Net MVC - 重载操作方法

c++ - 字符串文字匹配 bool 重载而不是 std::string

java - 同步线程和锁定

java - HashMap 不添加重复键

java - Camel 聚合器在新的关联键上完成聚合

c++ - 运算符重载和多态区别

java - Oracle 接手后,sun SCJP/SCJA/SCEA tracks 有哪些变化?

Java FileInputStream 将 3-4 个字节放入字节数组的相同索引中?