null值被视为Object或Array

时间:2014-11-20 12:15:03

标签: 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);
    }
}

输出:

array

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

5 个答案:

答案 0 :(得分:7)

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

Here's a link参考Java的官方文档,引用了这个案例。请查看 15.2.2 部分。引用一个有趣的部分(第15.2.2.5节):

  

如果多个成员方法都可访问且适用于a   方法调用,有必要选择一个提供   运行时方法调度的描述符。 Java编程   language使用选择最具体方法的规则。

     

非正式的直觉是一种方法更具体   如果可以传递第一个方法处理的任何调用,则为另一个   没有编译时类型错误的另一个。

另一个:

  

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

     

如果所有最大特定方法都具有覆盖等效方法   (§8.4.2)签名,然后:如果恰好其中一个最大特定   方法不是抽象的,它是最具体的方法。   否则,如果声明了所有最大特定方法   摘要,以及所有最大特定方法的签名   具有相同的擦除(§4.6),然后选择最具体的方法   任意地在最大特定方法的子集中   具有最具体的返回类型。但是,最具体的方法   当且仅当如此时,才会被视为抛出已检查的异常   异常或其擦除在每个的throws子句中声明   最具体的方法。否则,我们说的方法   调用不明确,发生编译时错误。

答案 1 :(得分:1)

总是子类比父类更受欢迎。如果要调用Object 1,可以执行以下操作:

new goFuncTest((Object) null);

答案 2 :(得分:1)

正如 pablo的答案所示,将调用最具体/最不通用的方法。实际上,检查类层次结构中的类 level 以决定调用哪个方法。调用具有较低类级别的方法。

如果2个类处于同一级别,那么您将收到一个编译时错误,指出 - ambiguous method call,就像下面的情况一样。

public class Sample {
void someMethod(Object o) {
    System.out.println("object");
}

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

void someMethod(int[] o) {
    System.out.println("int[]");
}

public static void main(String[] args) {
    new Sample().someMethod(null); // error ambiguous call both array and String are direct children of Object
}

案例-2:证明将调用具有较低级别级别的方法。

public class Sample {
void someMethod(Object o) {
    System.out.println("object");
}

void someMethod(OutputStream os) {
    System.out.println("OutputStream");
}

void someMethod(FileOutputStream fos) {
    System.out.println("FileOutputStream");
}

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

}

  

O / P:FileOutputStream

因为FileOutputStream是OutputStream的子节点,它又是Object类的子节点(FileOutputStream也是OutputStream和Object类的子节点)。因此编译器在解析方法调用时会像Object --> OutputStream --> FileOutputStream一样。

答案 3 :(得分:0)

Thumb方法在方法调用中是第一个。由于Object是all的父级,并且null可以分配给任何类型的对象实例变量,它将首先匹配任何java类型(当然是对象的子级),然后匹配超级父级,即Object。

答案 4 :(得分:0)

将Null渐变为数组优于将其转换为Object。对象在层次结构中位于顶部,而Array最接近Null。

这就像字节到int的渐变。