了解选择了哪个构造函数以及原因

Har*_*Joy 9 java

为什么每次打印时都遵循程序I'm string而不是I'm object.I'm int.

public class Demo {

    public Demo(String s){
        System.out.println("I'm string");
    }

    public Demo(int i){
        System.out.println("I'm int.");
    }

    public Demo(Object o){
        System.out.println("I'm object.");
    }

    public static void main(String[] args) {
        new Demo(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,如果我取代intInteger.它给出了错误,The constructor Demo(String) is ambiguous.为什么?

Jon*_*eet 22

null可以转换为ObjectString,但不是int.因此第二个构造函数已经出局.

在转换为Object或转换为之间String,转换String为更具体,所以这就是所选择的.

JLS 第15.12.2节描述了方法重载解析,我相信相同的方法用于构造函数解析.第15.12.2.5节描述了选择最具体的方法(本例中为构造函数):

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

这对构造函数调用与对象或字符串参数-处理的任何调用new Demo(String)也可以转嫁到new Demo(Object)没有编译时类型错误,但相反的是不是真实的,所以new Demo(String)一个更具体的...因而深受选择重载决策规则.