0

直接来自javadoc

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

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

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

2 回答 2

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方法是可变参数方法;可变参数是使用数组实现的。

于 2013-04-26T11:55:54.487 回答
1

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

于 2013-04-26T11:42:21.290 回答