2017-09-27 21 views
1

で文字列の連結は、Javaコンパイラは、以下のように連結文を見ているときながら:int型のJava

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

または、このようなprint文:

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

それはどのように原始的を変換しません整数(int)から文字列の表現ですか? 整数クラスであれば、そのtoString()メソッドが呼び出されているはずです。そして私は自動ボックスのコンセプトがここでは起こっていないと思います。新しいStringBuilderが作成され、append(int)メソッドが呼び出され見ることができるように

int i = 10; 
System.out.println("" + i); 

+0

あなたの2つの例は完全に無関係です。 – shmosel

+0

その場合、各シナリオではどうなりますか? – Manya

+0

ここに最初の情報があります:https://stackoverflow.com/q/14782804/1553851 – shmosel

答えて

3

バイトコードは、この

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 

のようになります。

System.out.println(10)ケースはさらに単純です。いくつかのオーバーロードされたメソッドwhit名printlnがあり、そのうちの1つがパラメータとしてintを受け入れます。

1

あなたの2つの例は関連していません。

int x = 1234; 
String y = "Some random String " + 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) 

のprintln(int型x)は:第2例

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

のPrintStreamのSystem.outのように多くのオーバーロードされたメソッドがありますがで

new StringBuilder("Some random String ").append(x)

呼び出される

+1

thanksたくさん :) – 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()を呼び出し、少なくとも1つのパラメータが文字列の場合

関連する問題