2016-08-14 19 views
10

Klasa StringBuilder definiuje cztery konstruktorów, a żaden z nich nie akceptuje StringBuilder jeszcze następujące kompiluje:Konstruktor StringBuilder akceptuje obiekt StringBuilder - dlaczego?

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

Czy to oznacza, że ​​obiekt zostanie anonimowy StringBuilder jakoś przekształcić w ciąg wewnętrznie przez kompilator?

+2

Wewnętrzna 'StringBuilder' nie jest przypisany do żadnej zmiennej, ale w języku Java termin * anonimowe * ma inne znaczenie. – manfcas

+0

@manfcas Ten komentarz byłby bardziej przydatny, jeśli faktycznie wyjaśnisz * co * oznacza anonimowy w Javie, np. z linkiem do [The Java ™ Tutorials - Anonymous Classes] (https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html). – Andreas

+0

To nie jest tak naprawdę terminologia Java, ale "rvalue" to dokładny opis. –

Odpowiedz

9

A StringBuilder to CharSequence (implementuje ten interfejs) i there is a constructor taking a CharSequence. To dlaczego dany kod kompiluje:

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

Co to konstruktor robi jest po prostu zainicjować nową StringBuilder z treścią danego CharSequence. Wynik będzie taki sam, jak mając

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

Jeśli spojrzysz na źródło (ja patrzyłem na Java 8), to nie wywołuje 'toString()'. Wywołuje 'append (CharSequence s)', który wywołuje pakiet-private 'append (abstractStringBuilder asb), aby bezpośrednio skopiować znaki z wewnętrznej tablicy. – Andreas

+0

@Andreas Dobra uwaga, usunąłem informacje o tym falsyfikacie. – Tunaki

+0

@Tunaki Astounding ... Co za podstępna klasa ... Teraz wiem, dlaczego działa także sb.append (sb). Dziękuję Ci. –