Строка генерируется во время ее ввода; но для того, чтобы этот ответ имел смысл, нам нужно пройти через его преобразования в процессе сборки и запуска приложения.
- Сначала вы ввели его в файл
*.java
. - Затем компилятор скопировал его в файл
*.class
как часть записей пула констант. - Затем программа запустилась, и был запрошен класс, что вызвало загрузчик классов для копирования файла из с диска в ОЗУ, инициируя создание записи метаданных объекта для переноса константы в пул констант.
Таким образом, существует несколько мест, где его можно «создать» в зависимости от того, какое определение вы используете. "создания", которое вы будете использовать sh.
Теперь в вашем первом примере объект String реализуется не при использовании строки, а при использовании файла *.class
. Тем не менее, это не ссылка на работающую программу до тех пор, пока вы не введете метод.
Наконец, с пулированием строк, каждый раз, когда собирается создать строку, выполняется поиск существующего пула строк и, если соответствующая запись найдено, соответствующая запись используется вместо создания новой строки. Это уменьшает количество строк во время выполнения за счет большого количества поиска строк.
Из-за деталей вашего кода у вас есть три разные строки, которые могут быть объединены («Hello Mr», значение user.firstName()
и строка, объединяющая их обоих). «Hello Mr» будет объединен с загрузкой класса (при условии объединения). Значение user.firstName()
произошло бы при первоначальном создании значения для возврата. Результирующая объединенная строка будет объединена непосредственно перед назначением (или ссылкой из пула, если она уже существует в пуле).