與C#一樣,java也對基本類型進行了封裝,int封裝出Integer類,boolean封裝出Boolean類。這樣一來,基本類型就突破了實值型別的限制,獲得了物件導向的好處。然而,與.NET不同,java中的封裝類是真正的參考型別,比如在java中用“==”比較兩個封裝類對象,儘管值相等,得到的結果也很可能是false,而不是像.NET一樣,將基本類型的一些操作符作了重載,使得“==”符號的行為看起來與基本類型完全一致。
在java中,“Integer i=10,j=10;”使得i==j為true,但如果i或者j任何一個使用“new Integer(10)”,那麼i==j的值將是false,因為java遇到new關鍵字就會開闢新的堆空間,這樣就導致兩個封裝類對象的引用地址不同。同樣的差異還出現在String類型。對此在java中強烈推薦使用equals方法而不是“==”來比較封裝類對象的值。
測試代碼如下:
code
public class ValueType
{
public static void main(String[] args)
{
int ii = 10, jj = 10;
System.out.println("ii==jj:" + (ii == jj)); // true
Integer i = new Integer(10), j = new Integer(10);
System.out.println("i==j:" + (i == j)); // false
System.out.println("i.equals(j):" + i.equals(j)); // true
System.out.println("ii==j:" + (ii == j)); // true
System.out.println("i.equals(jj):" + i.equals(jj)); //true
String x = "xxx";
String y = "xxx";
String z = new String("xxx");
System.out.println("x==y:" + (x == y)); //true
System.out.println("x.equals(y):" + (x.equals(y))); // true
System.out.println("x==z:" + (x == z)); // false
System.out.println("x.equals(z):" + (x.equals(z))); // true
System.out.println("x.subString(1,2):" + x.substring(1,2)); // x
}
}