2013-04-26 49 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方法是一个可变参数的方法;可变参数使用数组实现。