直接来自javadoc:
s', 'S' general 如果参数 arg 为 null,则结果为“null”。如果 arg 实现 Formattable,则调用 arg.formatTo。否则,通过调用 arg.toString() 获得结果。
这是否意味着在下面的代码行中,数字 3 (arg) 在 Integer 中自动装箱,然后方法 arg.toString() 被调用?
System.out.format("%10s",3);
直接来自javadoc:
s', 'S' general 如果参数 arg 为 null,则结果为“null”。如果 arg 实现 Formattable,则调用 arg.formatTo。否则,通过调用 arg.toString() 获得结果。
这是否意味着在下面的代码行中,数字 3 (arg) 在 Integer 中自动装箱,然后方法 arg.toString() 被调用?
System.out.format("%10s",3);
您可以通过编译一个小型测试程序,然后使用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
方法是可变参数方法;可变参数是使用数组实现的。
确实如此。所有可变参数都是自动装箱的。是的,toString()
方法被调用。