public class KungFu { public static void main(String[] args) { Integer x = 400; Integer y = x; x++; StringBuilder sb1 = new StringBuilder("123"); StringBuilder sb2 = sb1; sb1.append("5"); System.out.println((x == y) + " " + (sb1 == sb2)); } }
What is the result?
A. true true
B. false true
C. true false
D. false false
E. Compilation fails.
F. An exception is thrown at runtime.
答案:B
解析:
在 J2SE 1.4.2 之前
您要如下
才能將int包裝為一個Integer物件:
Integer integer = new Integer(10);
在 J2SE 5.0 之後您可以這麼寫:
Integer integer = 10;
看起來好像跟int(基本型別)的寫法沒兩樣
但其實是編譯器在背後自動根據您寫下的陳述
為您進行自動封裝(Autoboxing)
使用的是Integer.valueOf(i)
or Integer.intValue(i)
本質上integer還是Integer(包裝類別)的物件
Line 3: Integer x = 400;
編譯器會將Integer x 先 unboxing 成 int 類型
再包裝回Integer
Line 4: Integer y = x;
將x的位址指派給y
所以此時x==y會是true的
因為都指向同一位址
但是在Line 5: x++;
因包裝類別是不可變(immutable)的
這個動作使得x被指派了一個新的object
值為401
所以最後x==y就變false了
StringBuffer是可變(mutable)類,所以不會創建新的物件
直接更改舊物件的值
所以這題主要在考 mutable & immutable 的差別
參考學習連結:
http://www.coderanch.com/t/502518/java-programmer-SCJP/certification/pass-pass-reference
http://stackoverflow.com/questions/4117793/are-java-wrapper-classes-really-immutable
不可變類的進階學習
http://linxizeng.iteye.com/blog/137542
0 意見:
張貼留言