Задний план
Все объекты Java имеют toString()метод, который вызывается при попытке печати объекта.
System.out.println(myObject); // invokes myObject.toString()
Этот метод определен в Objectклассе (суперкласс всех объектов Java). Object.toString()Метод возвращает довольно уродливый ищет строку, состоящую из имени класса, с @символом и хэш - код объекта в шестнадцатеричном формате. Код для этого выглядит так:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Таким com.foo.MyType@2f92e0f4образом, такой результат можно объяснить как:
com.foo.MyType - имя класса, т.е. класс находится MyTypeв пакете com.foo.
@ - соединяет строку
2f92e0f4 хеш-код объекта.
Имена классов массивов выглядят немного иначе, что хорошо объясняется в Javadocs Class.getName(). Например, [Ljava.lang.Stringозначает:
[- одномерный массив (в отличие от [[и [[[т. д.)
L - массив содержит класс или интерфейс
java.lang.String - тип объектов в массиве
Настройка вывода
Для того, чтобы напечатать что - то другое , когда вы называете System.out.println(myObject), вы должны переопределить в toString()метод в вашем собственном классе. Вот простой пример:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
Теперь, если мы напечатаем Person, мы увидим их имя, а не com.foo.Person@12345678.
Имейте в виду, что toString()это только один из способов преобразования объекта в строку. Обычно этот вывод должен полностью описывать ваш объект в четкой и сжатой форме. Лучше toString()для нашего Personкласса может быть:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
Который напечатал бы, например Person[name=Henry]. Это действительно полезная часть данных для отладки / тестирования.
Если вы хотите сосредоточиться только на одном аспекте вашего объекта или включить много джазового форматирования, вам может быть лучше вместо этого определить отдельный метод, например String toElegantReport() {...}.
Автогенерация вывода
Многие IDE поддерживают автоматическую генерацию toString()метода на основе полей в классе. См. Документы для Eclipse и IntelliJ , например.
Несколько популярных библиотек Java также предлагают эту функцию. Вот некоторые примеры:
Печать групп объектов
Итак, вы создали хороший toString()для вашего класса. Что произойдет, если этот класс будет помещен в массив или коллекцию?
Массивы
Если у вас есть массив объектов, вы можете вызвать Arrays.toString()простое представление содержимого массива. Например, рассмотрим этот массив Personобъектов:
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
Примечание: это вызов статического метода, вызываемого toString()в классе Arrays, который отличается от того, что мы обсуждали выше.
Если у вас есть многомерный массив , вы можете использовать Arrays.deepToString()для достижения того же вида вывода.
Коллекции
Большинство коллекций будет производить симпатичный вывод, основанный на вызове .toString()каждого элемента.
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
Так что вам просто нужно убедиться, что ваши элементы списка определяют красивый, toString()как обсуждалось выше.