下面是具有3个重载构造函数的java类:

public class Test {

    public Test(Object i){
        System.out.println("Object invoked");
    }

    public Test(String i){
        System.out.println("String invoked");
    }

    public Test(int k){
        System.out.println("Integer invoked");
    }

    public static void main(String[] args) throws Exception {

        Test t = new Test(null);
    }
}

如果在创建类的新实例时传递了null值,将调用哪个构造函数?是什么原因 ?

最佳答案

Java总是选择最适合您传递的参数的方法(或构造函数)。在这种情况下,这就是String构造函数-StringObject的子类。
想想如果你有什么会发生

new Test("some string")
ObjectString构造函数都将在此处适用。毕竟,参数既是Object又是String。但是,很明显,将调用String构造函数,因为它比Object构造函数更具体,并且在给定参数的情况下仍然适用。null没什么不同;这两个构造函数仍然适用,并且出于相同的原因,仍然选择String构造函数而不是Object构造函数。
现在,如果存在两个同样“特定”的构造函数(例如,如果您有Integer构造函数),则在调用Test(null)时会出现编译错误。
这在JLS §15.12.2中有更详细的概述:

JLS §15.12.2.5概述了确定哪种方法最具体的显式过程。

关于java - 在具有重载构造函数的类中传递null时,首先调用哪个构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18803056/

10-11 22:57
查看更多