2017-09-27 42 views
1

字符串连接当一个Java编译器看到的串联声明如下:INT为String而在Java

int x = 1234; 
String y = "Some random String " + x; 

或像这样的打印语句:

int x = 1234; 
System.out.println(x); 

它是如何转换原始整数(整数)到它的字符串表示?我知道如果这是一个Integer类,它的toString()方法会被调用。我不认为这里的自动装箱正在发生的概念。

+0

你的两个例子是完全无关的。 – shmosel

+0

如果是这种情况,每种情况下会发生什么? – Manya

+0

以下是关于第一个的一些信息:https://stackoverflow.com/q/14782804/1553851 – shmosel

回答

3

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作为参数。

1

你的两个例子是不相关的。

在第一示例

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)的被调用

+1

谢谢很多 :) – Manya

1

字符串是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(),而至少有一个参数是字符串

希望你明白!