Метод toString()
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 41 из 87.
Каждый класс в Java наследуется от класса Object, который предоставляет несколько полезных методов. Один из наиболее часто переопределяемых — toString(), возвращающий строковое представление объекта.
По умолчанию toString() возвращает имя класса, за которым следует хеш-код объекта, что не очень полезно:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person p = new Person("Alice", 25);
System.out.println(p); // Person@15db9742Переопределив toString(), вы можете предоставить осмысленный вывод, описывающий состояние объекта:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person[name=" + name + ", age=" + age + "]";
}
}
Person p = new Person("Alice", 25);
System.out.println(p); // Person[name=Alice, age=25]Метод toString() вызывается автоматически, когда вы выводите object или объединяете его со string. Это значительно упрощает отладку, поскольку вы можете быстро увидеть содержимое object, не записывая дополнительный код.
Задание
ЛегкоДавайте создадим систему учёта товаров, которая отображает содержательную информацию об объектах с помощью пользовательских реализаций toString(). Вы создадите класс Product, переопределяющий стандартный метод toString(), чтобы предоставить ясное, удобное для чтения представление каждого товара.
Вы организуете код в двух файлах:
Product.java: Создайте класс, представляющий объект учёта. У каждого Product есть три private поля:name(String),price(double) иquantity(int). Добавьте constructor, который initializes все three fields. Переопределите методtoString(), чтобы он возвращал отформатированную строку в этом exact формате:Product[name=X, price=Y, quantity=Z], где X, Y и Z — actual значения полей. price должен отображаться как обычное число (специальное форматирование не требуется).Main.java: Оживите свой класс Product, создавая и отображая товары. Вы получите three inputs: имя товара (String), price (double) и quantity (int). Создайте Product с этими values, затем просто выведите объект товара напрямую с помощьюSystem.out.println(). Благодаря переопределённому методуtoString()это автоматически отобразит отформатированную информацию о товаре вместо загадочного вывода по умолчанию!
Вы получите three inputs: имя товара (String), price (double) и quantity (int).
Обратите внимание, как непосредственный вывод объекта автоматически вызывает ваш метод toString(). Именно это значительно упрощает отладку и ведение журналов в реальных приложениях!
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Считать входные данные
String name = scanner.nextLine();
double price = scanner.nextDouble();
int quantity = scanner.nextInt();
// TODO: Создайте объект Product с входными значениями
// TODO: Выведите объект product напрямую
// (Это автоматически вызовет ваш метод toString()!)
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»Потренируйтесь самостоятельно: Онлайн-компилятор Java