Java:正在发生自动包装吗?

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附带的一

直接从:

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

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

 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:返回
}
你可以看到它的作用:

  • 它创建一个
    对象[]
    ,其中首先存储字符串
    “%10s”
    (第3-10行)
  • 它调用
    Integer.valueOf()
    框选值
    3
    (第11、12行)
  • Integer
    对象存储在数组中(第15行)
  • 然后调用方法
    format(Object[])
    (第16行)
注意:之所以使用数组,是因为
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
}