字符串与对象类型构造函数

时间:2016-03-17 08:02:45

标签: java

public class App {
    public static void main(String[] args) {
        ConTest conTest = new ConTest(null);

    }

POJO:

public class ConTest {

    private String  a;

    private Object  b;

    public ConTest(Object b) {
        System.out.println("Object" + b);
    }

    public ConTest(String a) {
        System.out.println("String :" + a);
    }

}

当我运行这段代码时,它总是调用具有String参数的构造函数。为什么呢?

2 个答案:

答案 0 :(得分:5)

null可以传递给两个构造函数。

但是,String参数比Object参数更具体(因为StringObject的子类),并且重载解析过程的方法更喜欢具有更具体的参数类型的方法(或您的情况下的构造函数)。

如评论中所述,如果您想强制调用接受Object的构造函数,则可以将null强制转换为Object

ConTest conTest = new ConTest((Object)null);

答案 1 :(得分:3)

原因是,有多个拟合方法(在这种情况下是构造函数)适合调用。如果方法调用有多个拟合方法,那么它总是采用最具体的方法。在这种情况下,StringObject更具体。 这可以在继承链中看到。 String继承自Object

如果有两个同样具体的方法,那么编译器会告诉您错误消息The method method(parameter) is ambiguous for the type Class。这可以在这个例子中看到。

public class A { 
    public static void main(String[] args) {
        // compiler complains with:
        // The method test(Object) is ambiguous for the type A
        test(null); 
    }

    static void test(Object o) {
        System.out.println("IN OBJECT");
    }

    static void test(A a) {
        System.out.println("IN A");
    }

    static void test(B b) {
        System.out.println("IN B");
    }

    class B {

    }
}

稍微改变一下,让B继承A后,方法test(B)会变得更加具体,因为BA更具体,并且编译器错误消息消失了。

public class A { 
    public static void main(String[] args) {
        test(null);
    }

    static void test(Object o) {
        System.out.println("IN OBJECT");
    }

    static void test(A a) {
        System.out.println("IN A");
    }

    static void test(B b) {
        System.out.println("IN B");
    }

    class B extends A{

    }
}