Java Puzzlers: 字串物件的特殊性11,67

請問這兩個的輸出結果各是什麼?
System.out.println("A"+"B");
System.out.println('A'+'B');
from Java Puzzlers結果:上面輸出的結果是是AB,下面的是則不是AB,而是印出131。

Java字串的加法,是會將兩個字串合起來,然而,字元的加法就沒有這樣的規則,而是運用了整數運算,將'A'與'B'的code number相加起來,產生131的結果。

而我們可以利用""(空字串)將整個運算式變成字串與字元的加法,也就是字串加入一個字元,就能使字元輸出成AB。若是要銜接非常多的字串,不建議使用Java緩慢的字串加法,請以StringBuffer或StringBuilder替代之。
System.out.println(""+'A'+'B');

你還可以試試看下面的程式碼
int foo = 1234 , foo2 = 4321;
System.out.println(foo + foo2);
System.out.println(""+ foo + foo2);
當你要弄一個複雜的輸出,就有必要用括號處理你所想要的結果,或是使用JDK5.0後有的printf,利用如同C語言的printf方法,進行格式化輸出。
int foo = 1234 , foo2 = 4321;
System.out.println("add=>"+ (foo + foo2) +" concat=>"+foo+foo2);

結論
套一句Java Puzzlers作者的話
When using the string concatenation operator, always parenthesize nontrivial operands. 當你使用字串連接運算時,永遠要用小括號將重要的運算式包起來。


Puzzlers 67: All Strung Out

我們創造了一個我們自己的String,打算取代原本的String 你覺得這樣寫如何?
public class StrungOut {
public static void main(String[] args) {
String s = new String("Hello world");
System.out.println(s);
}
}

class String {
private final java.lang.String.s;
public String (java.lang.String s) {
this.s = s;
}
public java.lang.String toString() {
return s;
}
}


這個Puzzler非常有好笑,它會產生NoSuchMethodError,就因為編譯器找不到啟動程式的main方法。就因為我們自己定義了String類別,因此StungOut的main函式所使用的String[] arg是指我們自定義的String,而不是Java的java.lang中的所載入的String類別。

但是系統卻不是偵測到ambiguous,而是找不到方法的錯誤。記得在我曾經在使用Timer時,
就有被編譯器指出錯誤的經驗,因此產生這個結果讓我挺納悶的,我也只能猜測Java載入java.lang中的類別是選擇性的選項,若已有搜尋到其他類別路徑中的類別,就會忽略他們java.lang。關於我這裡的疑問,Java Puzzlers書中並沒有提到這樣的問題,我或許該try一下結果,或許JVM已經有所改變了。


待測試項目
 1. 本Puzzler
 2. import其他package中的String類別。
 3. 分別寫成兩個檔案,並各自編譯。

留言