Лучше всего я вижу:
public String makinStrings() {
String s = “Fred”;
"Fred" - строковый литерал, созданный и добавленный в пул String во время загрузки класса.Объект не создается, когда он назначен;присваивание просто передает ссылку на существующую строку.
s = s + “47”;
Здесь новая строка создается как комбинация предыдущего значения s и литерала "47".(1)
s = s.substring(2, 5);
substring () не работает с самой строкой (строки неизменяемы в Java), а возвращает новую строку, которая является возвращаемым значением метода.(2)
s = s.toUpperCase();
Новая строка по той же причине, что и предыдущая строка.(3)
return s.toString();
}
toString () в классе String возвращает ссылку на саму String.Новый объект не создан.
Так что 3 звучит как правильный ответ.