java对象变量的疑问
《java核心技术》中讲到:一个要认识到,一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。old = new Class; new = old;让new、old两个变量引用同一个对象。
public class test
{
public static void main( String[] args )
{
String oldStr = new String();
oldStr = "oldStr";
String newStr = oldStr;
newStr = "newStr";
System.out.println( oldStr );
System.out.println( newStr );
}
}
运行结果是
OldStr
newStr
newStr、OldStr并没有指向同一个对象,请问大家是什么原因。
------解决方案--------------------String比较特别,LZ可以用StringBuffer试试:
StringBuffer oldStr = new StringBuffer("1");
StringBuffer newStr = oldStr;
oldStr.append("2");
System.out.println(oldStr==newStr);
System.out.println(oldStr);
System.out.println(newStr);
------解决方案--------------------String是常量对象..,和一般的对象不同。
String s1 = "abc";
String s2 = "abc";
这样,s1,s2都会指向同一个地址。
因为"abc" 会在常量池中占据一个内存空间,所有的 ="abc" 都会指向该空间。
但如果你使用
String s = new String("abc");就不会指向常量池"abc”;
String s1 = new String("abc");
String s2 = s1;
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
这样 s1 = s2了。
因为是按照对象的构造方法来的,而不是通过指向一个常量进行赋值的。
String s = "abc";
和
String s = new String("abc)";
具有不同的效果。
------解决方案--------------------String str1 = "java";//常量池中创建
String str2 = new String("java");//堆中创建
String str3= "java";//量池中已经创建了,不在创建,直接指向str1
除了String,Java中还有什么类型是特殊的? 没有了