Задний план
Все объекты 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()
как обсуждалось выше.