具有null值的字符串构造函数

为什么具有null值的String(String)构造函数会导致编译时错误? 我认为有2+构造函数接受Object和init。 它与null它不知道从哪个开始。 我想知道是否还有其他原因

String s = new String(null); // compile time error StringBuffer sb = new StringBuffer(null); // no error 

因为,编译器无法确定要调用的构造函数。 在这里看到它有多少一个参数构造函数。

[编辑]你说,如果还有其他原因。 那么为什么不试试自己呢。 做这样的事情,

 byte[] b = null; String s = new String(b); // complier should be fine with this char[] c = null; String s = new String(c); // complier should be fine with this .... // you can try other constructors using similar approach. 

通常,当您调用可能适用多个重写版本的构造函数或方法时,Java将选择最具体的构造函数或方法。 Java语言规范的第15.12.2节详细解释了这一点。

假设您有两个重载方法,如下所示:

 public void method(Object o) { // ... } public void method(String s) { // ... } 

当您调用method(null) ,这两种方法都适用。 Java选择最具体的一个,在本例中是第二个方法,它接受一个String – 因为String是一个比Object更具体的类型。

但是,有时无法确定最具体的构造函数或方法。 如果我们查看String一个参数的String类的构造函数:

 String(byte[] bytes) String(char[] value) String(String original) String(StringBuffer buffer) String(StringBuilder builder) 

请注意, byte[]char[]StringStringBufferStringBuilder类型之间没有层次结构,因此不可能说其中一个构造函数比其他构造函数更具体。 因此,Java编译器不知道选择哪个构造函数,并且会给您一个错误。

只是为解决方案增加更多清晰度:

举个例子:

 public class Test { public Test(Object obj) { System.out.println("Object"); } public Test(String obj) { System.out.println("String"); } public static void main(String[] args) { new Test(null); } } 

它不会抛出任何编译时错误,因为编译器将选择可用相同类型的最具体的构造函数。 但是,如果我将类更改为:

 public class Test { public Test(Long lg){ System.out.println("Long"); } public Test(Object obj) { System.out.println("Object"); } public Test(String obj) { System.out.println("String"); } public static void main(String[] args) { new Test(null); } } 

它会抛出编译时错误。 由于这里涉及两个单独的构造函数层次结构,因此编译器无法做出决策。 一个层次结构是:Object – > String,第二个是Object – > Long,因此无法在Long或String类型构造函数之间进行选择。

String有很多构造函数。 null可用于他们。

编辑:String在Java 6中有5个单参数构造函数。感谢BoltClock和Adeel Ansari!