2016-04-13 9 views
2

私はかなり簡単な質問があります。System.out.printlnの整数 - unboxingまたはtoString()?

私はこの1つのようなコードスニペットを書く:

Integer integer = new Integer(42); 
System.out.println(integer); 

質問はここに起こった何ですか? int型の値をprivitiveする

  • 自動アンボクシング整数、または
  • Integer型のtoString()メソッドが呼び出されたのですか?まあ

答えて

3

、メソッドのオーバーロード解決のプロセスは3つの段階があり、初期段階は候補メソッドに引数を一致させるためにアンボクシングボクシング/をしない、ここに呼ばれてPrintStream方法はInteger以来、public void println(Object x)する必要がありますので、 Objectです。

void println(Object x)String.valueOf(Object)IntegertoString())を呼び出します。

バイトコード:

 0: new   #16     // class java/lang/Integer 
    3: dup 
    4: bipush  42 
    6: invokespecial #18     // Method java/lang/Integer."<init>":(I)V 
    9: astore_1 
    10: getstatic  #21     // Field java/lang/System.out:Ljava/io/PrintStream; 
    13: aload_1 
    14: invokevirtual #27     // --> Method java/io/PrintStream.println:(Ljava/lang/Object;)V 
    17: return 
+0

@ TheLostMindこの種類のバイトコードを自分自身でプレビューするにはどうすればよいですか? :) – null

+0

@HubertPopiołkiewicz - Use 'javap -v className.class' – TheLostMind

2

第一相JLS # 15.12.2. Compile-Time Step 2: Determine Method Signatureからは(§15.12.2.2)ボクシングまたはアンボクシング変換、または変数アリティメソッド呼び出しの使用を可能にすることなく、オーバーロード解決を行います。この段階の間に適用可能な方法が見つからない場合、処理は第2段階に進む。

したがって、アンボックスは実行されず、Object paramメソッドが選択されました。

整数のtoString()メソッドが呼び出されました。

+1

これは良い答えです。 JLSの参考文献には理由が説明されており、他のJavaコンパイラとは異なる可能性があるだけではないことも示されています。 –

関連する問題