《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并没有指向同一个对象,请问大家是什么原因。
{
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并没有指向同一个对象,请问大家是什么原因。
又指向一个新的对象"newStr"了。
StringBuffer newStr = oldStr;
oldStr.append("2");
System.out.println(oldStr==newStr);
System.out.println(oldStr);
System.out.println(newStr);
用不专业的只是给你解答其实 其实你的old 和 new 都是两个 引用,什么是应用呢 就好比 你拿的遥控器,遥控器能控制相应的电视。String oldStr = new String();// 你给了一个 没有名字的string 电视 遥控器给了old
oldStr = "oldStr"; //这里你把一个名字为oldStr的遥控器 给了 old 这时候 old表示的是新的遥控器了 而非开始的new String的那个了
String newStr = oldStr;这个时候 new 和old 拿着同一个遥控器 可以控制同一个电视
newStr = "newStr";//这个时候你又给了new 一个 名字为newStr的遥控器 明显最后的结果是 old 拿着 oldStr的遥控器 new 拿着 newStr的遥控他们控制不同的电视 这个电视是内存
我试了StringBuffer,结果oldstr和newstr相等,运行结果是:
true
12
12
除了String,Java中还有什么类型是特殊的?
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 str2 = new String("java");//堆中创建
String str3= "java";//量池中已经创建了,不在创建,直接指向str1 除了String,Java中还有什么类型是特殊的? 没有了
String oldStr = new String();
oldStr = "oldStr";
注意这里其实创建了两个实力。