一 基本概念
可變類和不可變類(mutable and immutable objects)的初步定義:
可變類:當獲得這個類的一個執行個體引用時,可以改變這個執行個體的内容。
不可變類:不可變類的執行個體一但建立,其内在成員變量的值就不能被修改。其中string類就是不可變類的經典應用。
二 例子
package cn.xy.test;
public class stringtest
{
/**
* a的值在編譯時就被确定下來,故其值"xy"被放入string的駐留池(駐留池在堆中)并被a指向。
* b的值在編譯時也被确定,那麼b的值在string的駐留池中找是否有等于"xy"的值,有的話也被b指向。
* 故兩個對象位址一緻
* @return true
*/
public static boolean teststring1()
{
string a = "xy";
string b = "xy";
return a == b;
}
* b的值在是兩個常量相加,編譯時也被确定。
public static boolean teststring2()
string a = "xyy";
string b = "xy" + "y";
* b的值為一個變量和一個常量相加,無法編譯時被确定,而是會在堆裡新生成一個值為"abc"的對象
* @return false
public static boolean teststring3()
b = b + "y";
* b的值都無法編譯時被确定,而是會在堆裡分别新生成一個對象叫"xyy"。
public static boolean teststring4()
string b = "xy".concat("y");
* new string()建立的字元串不是常量,不能在編譯期就确定,是以new string() 建立的字元串不放入常量池中,它們有自己的位址空間。
* a,b的值都無法編譯時被确定,會在堆裡分别新生成一個值為"xy"的對象。
* @return fasle
public static boolean teststring5()
string a = new string("xy");
string b = new string("xy");
* intern()把駐留池中"xy"的引用賦給b。
public static boolean teststring6()
b = b.intern();
return a == b.intern();
* char的tostring方法傳回的是一個char對象的字元串,而不是我們想象的"xy"
public static boolean teststring7()
char[] a = new char[]{'x','y'};
return a.tostring().equals(b);
* char是一種新的類型,不存在駐留池的概念。
public static boolean teststring8()
return a.tostring() == b;
/**
* string不可變性的展現
string str = "xy";
public string chage(string str)
str = "xyy";
return str;
* 一般引用類型的可變性(傳值的時候把位址傳過去,相當于把倉庫的要是交給方法,方法拿到鑰匙去移動倉庫裡的東西)
person p = new person("xy");
public string changeperson(person p)
p.setname("xyy");
return p.tostring();
public static void main(string[] args)
print(teststring1()); // true
print(teststring2()); // true
print(teststring3()); // fasle
print(teststring4()); // false
print(teststring5()); // false
print(teststring6()); // true
print(teststring7()); // false
print(teststring8()); // false
stringtest t = new stringtest();
print(t.str); // xy
print(t.chage(t.str)); // xxy
print(t.str); // xy
print(t.p.tostring()); //xy
print(t.changeperson(t.p)); //xyy
print(t.p.tostring()); //xyy
public static void print(object o)
system.out.println(o);
}