直接来自javadoc:
s','S'general如果参数arg为null,则结果为 “空值”。如果arg实现了Formattable,则调用arg.formatTo。 否则,通过调用arg.toString()获得结果。
这是否意味着在下面的代码行中,数字3(arg)在一个Integer中被自动装箱,然后调用方法arg.toString()?
System.out.format("%10s",3);
答案 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使用数组实现。