2013-04-26 60 views
0

直接從javadocJava:正在發生自動包裝?

S', 'S' 一般如果參數arg爲null,則結果爲 「空」。如果arg實現Formattable,則調用arg.formatTo。 否則,通過調用arg.toString()獲得結果。

這是否意味着在下面的代碼行中,數字3(arg)在Integer中自動裝箱,然後調用arg.toString()方法?

System.out.format("%10s",3); 

回答

1

它的確如此。所有可變參數都是自動裝箱的。是的,toString()方法被調用。

+0

乾杯非常感謝。 – Rollerball 2013-04-26 11:45:07

1

您可以檢查自己是什麼通過編寫一個小的測試程序到底會發生,然後反編譯它與javap(JDK包含的工具):

public class Example { 
    public static void main(String[] args) { 
     System.out.format("%10s",3); 
    } 
} 

javac Example.javajavap -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方法是一個可變參數的方法;可變參數使用數組實現。