S', 'S' 一般如果参数arg为null,则结果为 “空”。如果arg实现Formattable,则调用arg.formatTo。 否则,通过调用arg.toString()获得结果。
这是否意味着在下面的代码行中,数字3(arg)在Integer中自动装箱,然后调用arg.toString()方法?
System.out.format("%10s",3);
S', 'S' 一般如果参数arg为null,则结果为 “空”。如果arg实现Formattable,则调用arg.formatTo。 否则,通过调用arg.toString()获得结果。
这是否意味着在下面的代码行中,数字3(arg)在Integer中自动装箱,然后调用arg.toString()方法?
System.out.format("%10s",3);
它的确如此。所有可变参数都是自动装箱的。是的,toString()
方法被调用。
您可以检查自己是什么通过编写一个小的测试程序到底会发生,然后反编译它与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
方法是一个可变参数的方法;可变参数使用数组实现。
干杯非常感谢。 – Rollerball 2013-04-26 11:45:07