Java 将null传递给重载的方法

Java 将null传递给重载的方法,java,object,null,integer,Java,Object,Null,Integer,我对以下两个程序的输出感到困惑 当我在程序1中只有两个参数为String和Object的方法时,它会将我的输出作为String 但是,当我在程序2中添加一个参数为Integer的新方法时,它将不会编译,并给出如下错误 方法nullTest(对象)对于类型testNull不明确 程序1: 输出:字符串 程序2: 输出: 线程“main”java.lang中出现异常。错误:未解决的编译问题: 方法nullTest(对象)对于类型testNull不明确 位于onkartest.testNull.mai

我对以下两个程序的输出感到困惑

当我在程序1中只有两个参数为
String
Object
的方法时,它会将我的输出作为
String

但是,当我在程序2中添加一个参数为
Integer
的新方法时,它将不会编译,并给出如下错误 方法nullTest(对象)对于类型testNull不明确

程序1:

输出:字符串

程序2:

输出:

线程“main”java.lang中出现异常。错误:未解决的编译问题:

方法nullTest(对象)对于类型testNull不明确

位于onkartest.testNull.main(testNull.java:26)

而且,如果我运行程序时只保留
对象
参数方法,它会将输出作为
对象


你能给我解释一下这种行为背后的原因吗?

在决定使用哪个函数时,Java会试图找到具有最具体输入参数的函数。因此,在第一种情况下,字符串函数被选择为null,可以分配给字符串。对象是字符串的父对象,因此字符串函数将更加具体


在第二种情况下,Integer和String都继承自Object,并且它们都可以指定为null。因此,这两个函数都是同样特定的,Java无法决定使用哪一个函数

当尝试将参数传递给方法时,它首先尝试完全相同的类型。如果没有,则尝试使用立即超级类型。在第一个程序中,对象大于字符串,所以它与字符串匹配。但在第二个程序中,对象类在同一级别上有两个子类,所以java编译器无法找到哪一个子类映射空值

原因是,在方法重载的情况下,当传递一个可以被子类和父类引用的参数时,将始终调用具有类型为child class的参数的方法

字符串是Object的子类,因此调用它的方法

在下面的示例中,我们有类
父类
,可以看作
对象
类和
子类
类,可以看作
字符串

现在你的程序1发生了什么,完全一样的事情发生了,那就是调用带有子类对象参数的方法

public class Program 
{
 public static void method(Parent p1)//Consider the Parent as Object 
 {
     System.out.println("parent");   
 }
 public static void method(Child c)//Consider the Child as String
 {
     System.out.println("Child");    
 } 
 public static void main(String []args)
 {
     method(null);
 }     
}
class Parent//consider Parent as Object
{

}
class Child extends Parent//consider Child as String
{

}
但是假设现在您添加了以下类
Child2
,该类可以被视为您的
Integer
Child2
Parent
的子类,就像
Integer
Object

class Child2 extends Parent
{

}
并添加以下方法

public static void method(Child2 c)//Consider the Child2 as Integer 
 {
     System.out.println("Child");    
 } 
现在发生的正是程序2中发生的事情。原因是编译器无法确定哪一个是正确的,因为二者都是同一父类的子类,最重要的是,它们中没有一个(Child2或child)是另一个的父类


如果两个类中的任何一个都是另一个的子类,并且都继承父类,那么就不会有歧义,子类的方法也会被调用。

我想你的意思是,“在第一个程序中,对象大于字符串,所以它将与字符串匹配”@Onkar Nevgi程序中的歧义不是因为两者都是对象的子类,而是因为没有子类共享任何父子关系。@Onkar Nevgi希望您理解两者之间的区别。是的。理解逻辑。
class Child2 extends Parent
{

}
public static void method(Child2 c)//Consider the Child2 as Integer 
 {
     System.out.println("Child");    
 }