Java:正在发生自动包装吗?
直接从: 如果参数arg为null,则结果为 “空”。如果arg实现Formattable,则会调用arg.formatTo。 否则,将通过调用arg.toString()获得结果 这是否意味着在下面的代码行中,数字3(arg)将自动装箱为整数,然后调用arg.toString()方法Java:正在发生自动包装吗?,java,format,autoboxing,Java,Format,Autoboxing,直接从: 如果参数arg为null,则结果为 “空”。如果arg实现Formattable,则会调用arg.formatTo。 否则,将通过调用arg.toString()获得结果 这是否意味着在下面的代码行中,数字3(arg)将自动装箱为整数,然后调用arg.toString()方法 System.out.format("%10s",3); 是的。所有可变参数都是自动装箱的。是的,调用了toString()方法。您可以通过编译一个小测试程序,然后使用javap对其进行反编译(JDK附带的一
System.out.format("%10s",3);
是的。所有可变参数都是自动装箱的。是的,调用了
toString()
方法。您可以通过编译一个小测试程序,然后使用javap
对其进行反编译(JDK附带的一个工具),来检查到底发生了什么:
用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
}
从“Example.java”编译而来
公开课范例{
公众榜样();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:getstatic#2//Field java/lang/System.out:Ljava/io/PrintStream;
3:ldc#3//字符串%10s
5:iconst_1
6:anewarray#4//类java/lang/Object
9:dup
10:iconst_0
11:iconst_3
12:invokestatic#5//方法java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
15:aastore
16:invokevirtual#6//方法java/io/PrintStream.format:(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
19:流行音乐
20:返回
}
你可以看到它的作用:
- 它创建一个
,其中首先存储字符串对象[]
(第3-10行)“%10s”
- 它调用
框选值Integer.valueOf()
(第11、12行)3
对象存储在数组中(第15行)Integer
- 然后调用方法
(第16行)format(Object[])
format
方法是varargs方法;varargs是使用数组实现的
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
}