对于String ,大家知道JDK里的构造方法有三种
public String();
public String(String value);
String(StringBuffer buffer);
JLS里说了。
String 是唯一一个不需要new 来初始化的。。所以你在jdk的api中别指望找到其他类象String一样的。
由于字符比较具有特殊性,也就决定了String类的特殊性。
大家想想:如果 String a = new String();这样意味着什么?String 实例化了一个a。并且给它赋予了"" 空字符串,并且是一个0长度的字符数组。那这样的初始化有什么意义呢?
所以String a = new String(),为了方便索性就不用了.String a ;。
JLS说。每当一个0长度的字符串从类文件的常量池装载的时候都要调用一个String()构造方法。
也就是说 String a;String b;这样的写法,a,b都自动的调用a =new String();b=new String();
在看看String 构造不为0零长度的字符串:比如String a ="abc";
由于String 在类文件加载的时候,会隐含的创建一个String对象。
String a ="abc";a对象已经创建,并且给予赋值。 由于String其实是一个char[]数组,所以在String a ="abc";的时候也等于是隐式创建了char[]数组。
那 String(String value)的构造方法就是干什么呢?
JLS里说,它是一个复制构造方法。
看个例子
class Test{
public static void main(String[] args ){
String a= "abc";
String b= new String(a);
System.out.println(b.equals(a)); //true
System.out.println(b==a); //false
}
}
看见了,两个构造方法其实是不一样的。
String(String value)其实是等价引用创建一个"abc",而String s是直接创建了。
也就是说String(String value) 找到 a 字符串变量,然后将a引用过来。。
String(String value)是个引用过程。而创建,其实还是在 隐式创建的时候。
分享到:
评论