Класс Object. Метод toString

Возьмём для примера объект класса Nexus5. Если попытаться представить его как строку, результат будет выглядеть печально:

System.out.println("мой телефон: " + new Nexus5());
// мой телефон: Nexus5@4b67cf4d

На объекте был неявно вызван метод toString(), определённый в классе Object:

package java.lang;

/**
 * Class {@code Object} is the root of the class hierarchy.
 * Every class has {@code Object} as a superclass. All objects,
 * including arrays, implement the methods of this class.
 *
 * @author  unascribed
 * @see     java.lang.Class
 * @since   JDK1.0
 */
public class Object {

    ...

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

Этот метод достаётся всем классам от Object — корня всей иерархии классов в Java. Чтобы сделать результат приведения к строке более полезным, нужно переопределить toString():

abstract class MobilePhone extends Phone {

    // serialNumber, imei, batteryVoltage

    @Override
    public String toString() {
        return getClass().getSimpleName() + 
                "(serialNumber=" + serialNumber + 
                ", IMEI=" + imei + 
                ", batteryVoltage=" + batteryVoltage + "mV)";
    }
}

Результат может выглядеть, например, так:

мой телефон: Nexus5(serialNumber=621d1e9c-bd6a-446d-aa10-078d9b14f42a, IMEI=9213985984879277897, batteryVoltage=4138mV)

Обратите внимание: если вместо getClass().getSimpleName() «захардкодить» (записать жёстко, без возможности изменения) строку "MobilePhone", то и Nexus5 будет приводиться к строке как MobilePhone(serialNumber, IMEI и так далее).

Хорошим тоном считается осмысленное переопределение метода toString для всех классов. Очень желательно, чтобы все поля были упомянуты.

Комментарии к уроку

Сообщить об ошибке