2016-08-14 8 views
10

Класс StringBuilder определяет четыре конструктора, и ни один из них не принимает StringBuilder, но следующие компилирует:Конструктор StringBuilder принимает объект StringBuilder - почему?

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

Означает ли это, что анонимный StringBuilder объект получает каким-то образом преобразуется в строку внутренне компилятором?

+2

Внутренний 'StringBuilder' не назначен какой-либо переменной, но на языке Java термин * анонимным * имеет другое значение. – manfcas

+0

@manfcas Этот комментарий был бы более полезным, если бы вы на самом деле объяснили *, что * анонимно означает в Java, например. со ссылкой на [Учебники Java ™ - Анонимные классы] (https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html). – Andreas

+0

Это не действительно терминология Java, но 'rvalue' - точное описание. –

ответ

9

A StringBuilder является CharSequence (он реализует этот интерфейс) и there is a constructor taking a CharSequence. Именно поэтому данный код компилируется:

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

Что этот конструктор делает просто инициализировать новый StringBuilder с содержанием данного CharSequence. Результат будет таким же, как имеющие

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

Если вы посмотрите на источник (я посмотрел на Java 8), он не вызывает 'toString()'. Он вызывает 'append (CharSequence s)', который вызывает пакет-private 'append (AbstractStringBuilder asb)', чтобы скопировать символы из внутреннего массива напрямую. – Andreas

+0

@ Andreas Хорошая мысль, я удалил эту фальшивую информацию. – Tunaki

+0

@Tunaki Astounding ... Какой подлый класс ... Теперь я знаю, почему работает sb.append (sb). Спасибо. –

Смежные вопросы