← Назад к вопросам

Что такое метод toString() из класса Object?

1.6 Junior🔥 111 комментариев
#Soft Skills и карьера

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Метод toString() из класса Object

toString() — это фундаментальный метод класса Object в Java, который возвращает строковое представление объекта. Это один из самых важных методов, который следует переопределять в своих классах для получения более информативного представления объекта вместо стандартного вывода (имя класса + хеш-код).

Сигнатура метода

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

Стандартное поведение Object.toString()

public class DefaultToStringExample {
    public static void main(String[] args) {
        Person person = new Person("John", 30);
        
        System.out.println(person); // Person@4e25154f
        System.out.println(person.toString()); // Person@4e25154f
    }
}

class Person {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

Переопределение toString() - правильно

1. Простое переопределение

public class PersonWithToString {
    private String name;
    private int age;
    private String email;
    
    public PersonWithToString(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + "'" +
                ", age=" + age +
                ", email='" + email + "'" +
                "}";
    }
    
    public static void main(String[] args) {
        PersonWithToString person = new PersonWithToString("John", 30, "john@example.com");
        System.out.println(person);
    }
}

toString() вызывается автоматически

public class AutoToStringInvocation {
    public static void main(String[] args) {
        User user = new User("Alice", "alice@example.com");
        
        System.out.println(user); // println вызывает toString()
        System.out.println("User: " + user); // Конкатенация вызывает toString()
    }
}

class User {
    private String name;
    private String email;
    
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
    
    @Override
    public String toString() {
        return "User{name='" + name + "', email='" + email + "'}";
    }
}

В коллекциях

import java.util.ArrayList;
import java.util.List;

public class ToStringInCollections {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("John", 25));
        students.add(new Student("Jane", 23));
        
        System.out.println(students);
    }
}

class Student {
    private String name;
    private int age;
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + "}";
    }
}

Лучшие практики для toString()

Хорошие примеры:

// 1. Включай важные поля
public class GoodExample1 {
    private int id;
    private String name;
    
    @Override
    public String toString() {
        return "GoodExample1{" +
                "id=" + id +
                ", name='" + name + "'" +
                "}";
    }
}

// 2. Обрабатывай null значения
public class GoodExample2 {
    private String name;
    
    @Override
    public String toString() {
        return "GoodExample2{" +
                "name='" + (name != null ? name : "null") + "'" +
                "}";
    }
}

// 3. Не включай чувствительные данные
public class GoodExample3 {
    private int id;
    private String password;
    
    @Override
    public String toString() {
        return "User{id=" + id + "}";
    }
}

Когда НЕ следует переопределять toString()

// Плохо: долгие операции
public class BadExample1 {
    @Override
    public String toString() {
        return "Result: " + expensiveCalculation();
    }
}

// Плохо: изменение состояния
public class BadExample2 {
    private List<String> items;
    
    @Override
    public String toString() {
        Collections.sort(items); // Изменяет объект!
        return items.toString();
    }
}

// Плохо: возврат null
public class BadExample3 {
    @Override
    public String toString() {
        return null; // NullPointerException!
    }
}

toString() vs equals() и hashCode()

public class EqualsAndHashCodeExample {
    private int id;
    private String name;
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        EqualsAndHashCodeExample that = (EqualsAndHashCodeExample) o;
        return id == that.id;
    }
    
    @Override
    public int hashCode() {
        return java.util.Objects.hash(id, name);
    }
    
    @Override
    public String toString() {
        return "Example{" +
                "id=" + id +
                ", name='" + name + "'" +
                "}";
    }
}

Использование IDE для генерации

IntelliJ IDEA, Eclipse:

  • Правый клик -> Generate -> toString()
  • IDE создаст оптимальную реализацию автоматически

Lombok аннотация:

import lombok.ToString;

@ToString(exclude = "password")
public class UserWithLombok {
    private int id;
    private String name;
    private String password;
}

Когда toString() вызывается

  • System.out.println(object)
  • String concatenation: "Value: " + object
  • Логирование: logger.info("{}", object)
  • В коллекциях: System.out.println(list)
  • String.valueOf(object)
  • String.format("%s", object)
  • При выводе исключений и stacktrace

Метод toString() — это один из самых важных методов для отладки и логирования. Правильное его переопределение делает процесс разработки намного удобнее.