Java 方法重载相关:当null作为参数传递时

Java 方法重载相关:当null作为参数传递时,java,overloading,Java,Overloading,当null作为参数传递时,有人能解释下面程序的输出吗 public class TestThis { public void method(Object o){ System.out.println("object method"); } public void method(int[] intArray){ System.out.println("int array method"); }

当null作为参数传递时,有人能解释下面程序的输出吗

 public class TestThis {

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

    public void method(int[] intArray){
        System.out.println("int array method");
    }

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

}
输出:- 整数数组方法

public class TestThis {

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

    public void method(int[] intArray){
        System.out.println("int array method");
    }

    public void method(double[] doubleArray){
        System.out.println("double array method");
    }

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

}
编译时错误:-
method method(Object)对于类型TestThis

编译器发现您有两个方法,它们都可以将Object作为参数(因为double数组也是一个对象)

因此,当您只传递null时,编译器无法告诉您要调用哪个方法

相反,什么会起作用:

new TestThis().method((double[]) null);
作为记录:问题是-这不是关于多态性,而是关于重载。编译器必须修复编译时要调用的重载方法。因此,如果您的源代码没有提供足够的信息来做出该决定,客户会向您投诉

确切地说:在第一个示例中,有两个方法,编译器为(对象)选择一个


但在第二个示例中,您得到了三个方法,其中两个方法比(Object)更具体。这就是为什么它拒绝编译示例2。

选择具有最特定/最不通用类型的方法
Object
是所有其他类的超类,因此在第一种情况下,选择了
int[]intArray
方法

在第二种情况下,在同一级别上有两个类型,这将导致编译问题。不能有
String
StringBuilder
,因为它们在类层次结构中处于同一级别。您可以有
Exception
IOException
,因为它们处于不同的级别


null
可以传递给以引用类型为参数的任何方法,但同时需要确保没有采用相同级别类型的方法

整型数组不也是一个对象吗?@yeppe:不,
null
属于。编辑了我的问题。问题的这一方面走错了路。“两个比(对象)更具体”这里缺少一点:您可以有两个比
Object
更具体的方法,而不会有不明确的重载,例如,如果您对
Object
有重载,
CharSequence
String
。你能更精确一点吗?@yeppe-
int[]
也是一个级别低于
Object
类的类,因此被选中。类层次结构是
Object
在顶层,所有其他东西都在它下面,对吗?假设你指的是
Double
Float
,而不是
Double
Float
(它们都是原语),是的,最不通用的类也将是chosenPrimitive数组类型,编译器将选择具有双基元数组pram的对象和双基元数组-->方法,以及具有浮点基元数组参数的(对象浮点基元数组)-->方法,以此类推。{编译器只选一次更具体的。}:)@yeppe-是的,没错