Подтвердить что ты не робот

Определяется ли toString() для возврата для java.lang.String?

Рассмотрим

String foo = s.toString();

для экземпляра null java.lang.String java.lang.String s.

Является ли это определенным для возврата себя или это зависит от конкретной реализации Java? Из интереса взята "глубокая копия"?

Изучение моего исходного кода моего JDK подтверждает, что возвращается s, но настаивает ли JLS на этом? Меня воспитывали, рассматривая toString() как произвольную сериализацию, возможно, представителя объекта, но не обязательно так. Например, совершенно правдоподобно (по крайней мере, на мой взгляд), что реализация может окружать строку символами кавычек.

4b9b3361

Ответ 1

Вы не найдете никакой гарантии в JLS, но у вас есть один в javadoc:

Этот объект (который уже является строкой!) сам возвращается.

Ответ 2

Он возвращает себя

 /**
     * This object (which is already a string!) is itself returned.
     *
     * @return  the string itself.
     */
    public String toString() {
        return this;
    }

Рассматривая исходный код, вы легко можете это узнать.

Я уверен, что мы не можем найти спецификацию языка Java для каждой реализации метода. Как и любой другой метод класса toString() класса Java класса String, просто возвращает строковое представление его собственного.

Обновление:

Поскольку ваш фактический вопрос заключается в том, почему он возвращает его сам, а не копию или некоторые взломать как цитаты, чтобы создать новую строку, я немного не соглашусь с этим. Мои причины для того же (возможно, есть и другие веские причины, чем это), так как вы вызываете метод toString() для фактического экземпляра строки (s), я не вижу здесь никакого вреда. Если вы хотите поиграть, вы все равно сделаете это с экземпляром s.

Ответ 3

Да. См. Спецификация языка Java §1.4 - Связь с предопределенными классами и интерфейсами:

Как отмечалось выше, эта спецификация часто относится к классам API платформы Java SE. В частности, некоторые классы имеют особые отношения с языком программирования Java. Примеры включают классы, такие как Object, Class, ClassLoader, String, Thread, а классы и интерфейсы в пакете java.lang.reflect, среди прочих. Эта спецификация ограничивает поведение таких классов и интерфейсов, но не дает полной спецификации для них. Читатель ссылается на документацию API платформы Java SE.

Таким образом, javadoc этих классов (который является "документацией API платформы Java SE" ) является нормативным и является частью общей спецификации языка. И что явно указывается:

public String toString()

Этот объект (который уже является строкой!) сам возвращается.

Нет места для интерпретации.

(Это сломало бы бесчисленные программы, если бы они изменили его, чтобы сделать что-то другое).