Java 方法重载相关:当null作为参数传递时
当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"); }
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-是的,没错