2016-08-14 5 views
10

クラスStringBuilderは4つのコンストラクタを定義し、それらのどれもStringBuilderを受け入れていない、まだ次のコンパイル:StringBuilderコンストラクタはStringBuilderオブジェクトを受け入れます - なぜですか?

StringBuilder sb = new StringBuilder(new StringBuilder("Hello")); 

が、これは匿名StringBuilderオブジェクトが何らかの形でコンパイラによって内部の文字列に変換されることを意味するのでしょうか?

+2

内部 'StringBuilder'は、任意の変数に割り当てられますが、Java言語で用語*匿名の*は、別の意味を持っていません。 – manfcas

+0

@manfcasこのコメントは、Javaで何が匿名であるかを実際に説明した場合、より役に立ちます。 [The Java™Tutorials - Anonymous Classes](https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html)へのリンクがあります。 – Andreas

+0

これは実際にJavaの用語ではありませんが、 'rvalue'は正確な記述です。 –

答えて

9

StringBuilderは、CharSequence(そのインターフェイスを実装しています)とthere is a constructor taking a CharSequenceです。

StringBuilder sb = new StringBuilder(new StringBuilder("Hello")); 

何このコンストラクタはありませんが、単純に与えられたCharSequenceの内容で新しいStringBuilderを初期化されます。与えられたコードはコンパイル理由です。結果はのStringBuilderによって、および(他のクラスのうちの)文字列によって実装されるインターフェースであるCharSequenceに取るコンストラクタがあり

StringBuilder sb = new StringBuilder("Hello"); 
+0

ソース(Java 8を見てみました)を見ると、 'toString()'は呼び出されません。内部配列の文字を直接コピーするためにpackage-private 'append(AbstractStringBuilder asb)'を呼び出す 'append(CharSequence s)'を呼び出します。 – Andreas

+0

@Andreas良い点、私はこの偽の情報を削除しました。 – Tunaki

+0

@Tunaki Astounding ...なんて卑劣なクラス...今はなぜsb.append(sb)が動作するのか知っています。ありがとうございました。 –