如果用户将原始类型参数传递给println(),那么场景背后究竟发生了什么?

nge*_*esh 4 java

如果用户传递一个基本类型参​​数println(),那么场景后面到底发生了什么?例如

int i =1;

System.out.println("My Int"+i);

//and in

System.out.println(i)
Run Code Online (Sandbox Code Playgroud)

它是如何打印"My Int 1""1",即使它需要一个String对象?

更新..

我认为是AutoBoxing发挥作用.这也是真的吗?

Joa*_*uer 6

System.out是一个PrintStream.PrintStream有足够的重载println,suche as println(int)println(String),所以编译器将只选择最合适的.

什么发生在你的第一个例子是,你建立一个新String的使用字符串连接"My Int"i并通过 Stringprintln方法.该方法不需要知道如何"打印连接String值",因为它只是获得一个普通的String对象.


Jig*_*shi 5

System.out.println("My Int"+i);
Run Code Online (Sandbox Code Playgroud)

等于

System.out.println(new StringBuilder().append("My Int").append(i).toString();
Run Code Online (Sandbox Code Playgroud)

例如 :

public class Main{
  public static void main(String[] ar){
    int i = 10;
    System.out.println("My Int"+i);
  }
}
Run Code Online (Sandbox Code Playgroud)

现在观察代码

public static void main(java.lang.String[]);
  Code:
   0:   bipush  10
   2:   istore_1
   3:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   6:   new     #3; //class java/lang/StringBuilder
   9:   dup
   10:  invokespecial   #4; //Method java/lang/StringBuilder."<init>":()V
   13:  ldc     #5; //String My Int
   15:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/
String;)Ljava/lang/StringBuilder;
   18:  iload_1
   19:  invokevirtual   #7; //Method java/lang/StringBuilder.append:(I)Ljava/lan
g/StringBuilder;
   22:  invokevirtual   #8; //Method java/lang/StringBuilder.toString:()Ljava/la
ng/String;
   25:  invokevirtual   #9; //Method java/io/PrintStream.println:(Ljava/lang/Str
ing;)V
   28:  return
Run Code Online (Sandbox Code Playgroud)