有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java向重载方法传递null

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

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

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

程序1:

package onkartest;

public class TestNull {
    public static void nullTest(Object b)
    {
        System.out.println("object");
    }       
    
    public static void nullTest(String x)
    {
        System.out.println("String");
    }

    public static void main(String x[])
    {           
        nullTest(null);         
    }
}

输出:字符串

程序2:

package onkartest;

public class TestNull {
    public static void nullTest(Object b)
    {
        System.out.println("object");
    }       
    
    public static void nullTest(String x)
    {
        System.out.println("String");
    }
 
    public static void nullTest(Integer i)
    {
        System.out.println("Integer ");
    }
    
    public static void main(String x[])
    {       
        nullTest(null);     
    }
}

输出:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:

The method nullTest(Object) is ambiguous for the type testNull

at onkartest.testNull.main(testNull.java:26)

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

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


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

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