如果用户传递一个基本类型参数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发挥作用.这也是真的吗?
System.out是一个PrintStream.PrintStream有足够的重载println,suche as println(int)或println(String),所以编译器将只选择最合适的.
什么发生在你的第一个例子是,你建立一个新String的使用字符串连接"My Int"和i并通过该 String给println方法.该方法不需要知道如何"打印连接String值",因为它只是获得一个普通的String对象.
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)