S', 'S' 一般如果參數arg爲null,則結果爲 「空」。如果arg實現Formattable,則調用arg.formatTo。 否則,通過調用arg.toString()獲得結果。
這是否意味着在下面的代碼行中,數字3(arg)在Integer中自動裝箱,然後調用arg.toString()方法?
System.out.format("%10s",3);
S', 'S' 一般如果參數arg爲null,則結果爲 「空」。如果arg實現Formattable,則調用arg.formatTo。 否則,通過調用arg.toString()獲得結果。
這是否意味着在下面的代碼行中,數字3(arg)在Integer中自動裝箱,然後調用arg.toString()方法?
System.out.format("%10s",3);
它的確如此。所有可變參數都是自動裝箱的。是的,toString()
方法被調用。
您可以檢查自己是什麼通過編寫一個小的測試程序到底會發生,然後反編譯它與javap
(JDK包含的工具):
public class Example {
public static void main(String[] args) {
System.out.format("%10s",3);
}
}
與javac Example.java
與javap -c Example
編譯這一點,然後反編譯它:
Compiled from "Example.java"
public class Example {
public Example();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String %10s
5: iconst_1
6: anewarray #4 // class java/lang/Object
9: dup
10: iconst_0
11: iconst_3
12: invokestatic #5 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
15: aastore
16: invokevirtual #6 // Method java/io/PrintStream.format:(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
19: pop
20: return
}
你看這是什麼一樣:
Object[]
其中第一字符串"%10s"
被存儲(線3-10)Integer.valueOf()
到框中的值3
(線11,12)Integer
對象存儲在陣列(線15)format(Object[])
被調用(第16行)注意:該陣列使用,因爲format
方法是一個可變參數的方法;可變參數使用數組實現。
乾杯非常感謝。 – Rollerball 2013-04-26 11:45:07