字符串连接当一个Java编译器看到的串联声明如下:INT为String而在Java
int x = 1234;
String y = "Some random String " + x;
或像这样的打印语句:
int x = 1234;
System.out.println(x);
它是如何转换原始整数(整数)到它的字符串表示?我知道如果这是一个Integer类,它的toString()方法会被调用。我不认为这里的自动装箱正在发生的概念。
字符串连接当一个Java编译器看到的串联声明如下:INT为String而在Java
int x = 1234;
String y = "Some random String " + x;
或像这样的打印语句:
int x = 1234;
System.out.println(x);
它是如何转换原始整数(整数)到它的字符串表示?我知道如果这是一个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)
方法。
System.out.println(10)
情况更简单。有几个重载的方法名称为println
,其中一个接受int
作为参数。
你的两个例子是不相关的。
在第一示例
int x = 1234;
String y = "Some random String " + x;
这里基本上下面的代码是内部产生的。
new StringBuilder("Some random String ").append(x)
在第二实施例
int x = 1234;
System.out.println(x);
有所述的PrintStream的System.out的这么多的重载方法:
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)
这里的println(INT x)的被调用
谢谢很多 :) – Manya
字符串是Java中的类。 int是一个原始类型。
您无法强制将基元类型转换为对象。
操作数 “+” 是一个特殊的操作,例如:
public class TestSimplePlus
{
public static void main(String[] args)
{
String s = "abc";
String ss = "ok" + s + "xyz" + 5;
System.out.println(ss);
}
}
让我们来看看反编译代码:
package string;
import java.io.PrintStream;
public class TestSimplePlus
{
public TestSimplePlus()
{
// 0 0:aload_0
// 1 1:invokespecial #8 <Method void Object()>
// 2 4:return
}
public static void main(String args[])
{
String s = "abc";
// 0 0:ldc1 #16 <String "abc">
// 1 2:astore_1
String ss = (new StringBuilder("ok")).append(s).append("xyz").append(5).toString();
// 2 3:new #18 <Class StringBuilder>
// 3 6:dup
// 4 7:ldc1 #20 <String "ok">
// 5 9:invokespecial #22 <Method void StringBuilder(String)>
// 6 12:aload_1
// 7 13:invokevirtual #25 <Method StringBuilder StringBuilder.append(String)>
// 8 16:ldc1 #29 <String "xyz">
// 9 18:invokevirtual #25 <Method StringBuilder StringBuilder.append(String)>
// 10 21:iconst_5
// 11 22:invokevirtual #31 <Method StringBuilder StringBuilder.append(int)>
// 12 25:invokevirtual #34 <Method String StringBuilder.toString()>
// 13 28:astore_2
System.out.println(ss);
// 14 29:getstatic #38 <Field PrintStream System.out>
// 15 32:aload_2
// 16 33:invokevirtual #44 <Method void PrintStream.println(String)>
// 17 36:return
}
}
正如我们所看到的, “+” 操作数是调用StringBuilder.append(),而至少有一个参数是字符串
希望你明白!
你的两个例子是完全无关的。 – shmosel
如果是这种情况,每种情况下会发生什么? – Manya
以下是关于第一个的一些信息:https://stackoverflow.com/q/14782804/1553851 – shmosel