Почему в Java класс использует метод toString() по умолчанию и когда его нужно переопределять?

«Почему в Java класс использует метод toString() по умолчанию и когда его нужно переопределять?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод toString() предоставляется по умолчанию, потому что он объявлен в корневом классе Object, от которого неявно наследуются все классы в Java.

Реализация по умолчанию:

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

Она возвращает строку, состоящую из имени класса и шестнадцатеричного представления хеш-кода объекта (например, com.example.MyClass@15db9742).

Зачем переопределять toString()? Стандартная реализация не несет полезной информации о состоянии объекта. Переопределение необходимо для:

  1. Отладки и логирования. Упрощает чтение логов и вывод в консоль.
  2. Человеко-читаемого представления. Позволяет выводить значимые данные объекта.

Пример переопределения:

public class Person {
    private String name;
    private int age;

    // Конструктор, геттеры, сеттеры...

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + '}';
    }
}

// Использование:
Person person = new Person("Alice", 30);
System.out.println(person); // Неявно вызывается toString()
// Вывод: Person{name='Alice', age=30}

Важно: Многие инструменты (отладчики, System.out.println(), логирование, конкатенация строк) неявно вызывают toString() для объектов.