12

可能重复:
传递 null 时选择了哪个构造函数?

我最近在几天前编码时遇到了这种好奇心,似乎无法弄清楚为什么会发生以下情况:

鉴于下面的课程

public class RandomObject{
    public RandomObject(Object o){
        System.out.println(1);
    }
    public RandomObject(String[] s){ 
        System.out.println(2);
    }
}

进行调用时new RandomObject(null);,输出始终2与构造函数的创建顺序无关。为什么null指的是字符串数组而不是对象?

4

2 回答 2

14

这里的关键是 Object 是 String[] 的超类型

Java 使用最具体的可用方法来解决此类情况。Null 可以传递给这两种方法而不会出现编译错误,因此 Java 必须在这里找到最具体的方法。带有 String[] 的版本更具体 - 因此将选择执行。

于 2013-01-25T05:00:55.970 回答
6

之前有人问过这个问题,看看这个帖子

如果有两种情况可供选择,编译器将首先尝试选择更具体的情况。在这种情况下,String 将被选中而不是 Object。

在另一个问题中,它String str不是String[] s

因此,由于String[]它是一种比它的超类型更具体的数据类型Object,所以它被选中了。

于 2013-01-25T04:59:17.073 回答