问题1我声明了什么!String s = "Hello world!"; 许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:String string = s;我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。String s1 = "This is cool!"; // 生成一个字符串对象[OBJ_1],将其引用赋值给s1String s2 = "This is cool!"; // 将同样的对象[OBJ_1]的引用赋值给s2String s3 = new String("This is cool!"); // 新建一个字符串对象[OBJ_2],其引用赋值给s3;s1 = s2; // 将s2保存的[OBJ_1]的引用赋值给s1,没有实际效果s3 = "This is cool!"; // 将[OBJ_1]的引用赋值给s3,s3原先引用的[OBJ_2]不再被引用 这样的代码共有产生2个String实例,有1对象可以被GC。
|
|