Java:正在发生自动包装?

时间:2013-04-26 11:39:57

标签: java format autoboxing

直接来自javadoc

  

s','S'general如果参数arg为null,则结果为   “空值”。如果arg实现了Formattable,则调用arg.formatTo。   否则,通过调用arg.toString()获得结果。

这是否意味着在下面的代码行中,数字3(arg)在一个Integer中被自动装箱,然后调用方法arg.toString()?

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

2 个答案:

答案 0 :(得分:1)

确实如此。所有可变参数都是自动装箱的。是的,调用toString()方法。

答案 1 :(得分:1)

您可以通过编译一个小测试程序,然后使用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方法是varargs方法; varargs使用数组实现。