当java编译器看到如下的连接语句时:
int x = 1234;
String y = "Some random String " + x;
或者像这样的印刷声明:
int x = 1234;
System.out.println(x);
它如何将原始整数(int)转换为String表示?我知道如果它是一个Integer类,它的toString()方法就会被调用。我不认为这里发生了自动拳击的概念。
字节码
int i = 10;
System.out.println("" + i);
会是这样的
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
LDC ""
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ILOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
如您所见,创建了新的StringBuilder
并调用了append(int)
方法。
qazxsw poi案例甚至更简单。有几个名称为qazxsw poi的重载方法,其中一个接受System.out.println(10)
作为参数。
你的两个例子没有关系。
在第一个例子中
println
这里基本上是在内部生成以下代码。
int
在第二个例子中
int x = 1234;
String y = "Some random String " + x;
PrintStream System.out有很多重载方法:
new StringBuilder("Some random String ").append(x)
这里调用println(int x)
String是Java中的一个类。 int是基本类型。
您不能强制将基本类型转换为Object。
操作数“+”是一个特殊的操作数,例如:
int x = 1234;
System.out.println(x);
让我们来看看反编译代码:
println(boolean x)
println(char x)
println(int x)
println(long x)
println(float x)
println(double x)
println(char x[])
println(String x)
println(Object x)
我们可以看到,“+”操作数是调用StringBuilder.append(),而至少有一个参数是字符串
希望你明白!