Java 将null传递给重载的方法
我对以下两个程序的输出感到困惑 当我在程序1中只有两个参数为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
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");
}