Ответ
Метод toString() предоставляется по умолчанию, потому что он объявлен в корневом классе Object, от которого неявно наследуются все классы в Java.
Реализация по умолчанию:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Она возвращает строку, состоящую из имени класса и шестнадцатеричного представления хеш-кода объекта (например, com.example.MyClass@15db9742).
Зачем переопределять toString()?
Стандартная реализация не несет полезной информации о состоянии объекта. Переопределение необходимо для:
- Отладки и логирования. Упрощает чтение логов и вывод в консоль.
- Человеко-читаемого представления. Позволяет выводить значимые данные объекта.
Пример переопределения:
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() для объектов.