SCJP(OCPJP) 考古題解析 第41題

Given:

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.

答案:


解析:

在 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 意見:

張貼留言