null值被视为Object或Array

Raj*_*kar 4 java arrays null

public class Test
 {

    public Test(Object o) {
        System.out.println("object");
    }

    public Test(int[] o) {
        System.out.println("array");
    }

    public static void main(String[] args) {
        new Test(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

array
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这背后的原因吗?

Pab*_*ruz 7

规则是:将调用更具体的方法.在这种情况下,接收a的方法int[]比接收java.lang.Object参数的方法更具体.

这是 Java的官方文档的链接,引用了这个案例.看看第15.2.2节.引用一个有趣的部分(第15.2.2.5节):

如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符.Java编程语言使用选择最具体方法的规则.

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体.

另一个:

可能没有方法是最具体的,因为有两种或更多种方法是最具体的.在这种情况下:

如果所有最大特定方法都具有覆盖等效(§8.4.2)签名,则:如果其中一个最大特定方法未被声明为抽象,则它是最具体的方法.否则,如果所有最大特定方法都被声明为抽象,并且所有最大特定方法的签名具有相同的擦除(第4.6节),则在具有最大特定方法的子集中任意选择最具体的方法.最具体的退货类型.但是,当且仅当在每个最大特定方法的throws子句中声明该异常或其擦除时,才会考虑使用最具体的方法抛出已检查的异常.否则,我们说方法调用是不明确的,并且发生编译时错误.

  • @LutzHorn因为`java.lang.Object`是所有Java类型的根源 - 因此它是最不具体的类型(一切都扩展了`java.lang.Object`) (3认同)