Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重载参数为null的方法调用_Java_Overloading - Fatal编程技术网

Java 重载参数为null的方法调用

Java 重载参数为null的方法调用,java,overloading,Java,Overloading,可能重复: 在下面的代码中,输出是 串 如果我移除参数类型为String的方法,则输出为 反对 我知道当参数类型不完全匹配时,方法重载是如何起作用的,但我无法理解null如何被视为对象和/或字符串参数 对此有何解释 class C { static void m1(Object x) { System.out.print("Object"); } static void m1(String x) { System.out.print("

可能重复:

在下面的代码中,输出是

如果我移除参数类型为
String
的方法,则输出为

反对

我知道当参数类型不完全匹配时,方法重载是如何起作用的,但我无法理解null如何被视为
对象和/或
字符串
参数

对此有何解释

class C {

    static void m1(Object x) {
        System.out.print("Object");
    }
    static void m1(String x) {
        System.out.print("String");
    }

    public static void main(String[] args) {
        m1(null);
    }
}

如果在将
null
作为参数传递时需要强制调用特定的重载方法,则必须强制转换它,如下所示:

m1((String)null);

通过这样做,您可以确保调用的是正确的重载版本的方法。

您必须设置
null
的类型,以告诉Java您要调用什么函数


所以你可以:
m1((Object)null)
使用
对象调用实现
参数,您可以执行
m1((字符串)null)
调用另一个。

它始终使用第15.12.2.5节中规定的最具体的方法

简介对此相当具体:

如果一个方法调用可以访问并适用于多个成员方法,则有必要选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用的规则是选择最具体的方法

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法,而不会出现编译时类型错误,那么一个方法比另一个方法更具体

一般来说,至少在代码可读性方面,最好尽量明确。您可以将
null
强制转换为与要调用的签名匹配的类型。但这绝对是一个值得怀疑的做法。它假设每个人都知道这条规则,并使代码更难阅读


但是这是一个很好的学术问题,所以我+1你的问题。

当多个重载匹配一个签名时,Java从中选择最具体的方法

null
的值与
Object
String
匹配,但
String
Object
的子类,因此选择
String
。如果在类层次结构中添加另一个同级为
String
的重载,则会出现编译错误\

// DOES NOT COMPILE
class C {
    static void m1(Object x) {
        System.out.print("Object");
    }
    static void m1(String x) {
        System.out.print("String");
    }
    static void m1(Integer x) {
        System.out.print("Integer");
    }
    public static void main(String[] args) {
        m1(null);
    }
}

下面是一个详细讨论您的代码示例的示例。

1。由于字符串也是一个对象,
JVM
运行时调用哪个方法时变得混乱

2.如果要指定在运行时调用哪个方法,可以通过显式强制转换来实现

例如:

m1((String)null);

但是null如何与签名匹配。它既不是字符串也不是对象。字符串或对象可以表示为null,对吗?因此,null可以表示任何一种类型,因此两个签名都匹配。但由于字符串扩展了对象,所以字符串更为具体,并且在调用不明确时优先使用该方法。这不是JVM感到困惑的原因。它总会找到最具体的方法。它之所以混淆是因为null既不是字符串也不是对象。为什么
m1(整数x)
会导致编译时错误?