У меня есть класс, определенный следующим образом:
public class Person {
private String name;
// constructor and getter/setter omitted
}
Я попытался напечатать экземпляр моего класса:
System.out.println(myPerson);
но я получил следующий результат: com.foo.Person@2f92e0f4
.
Похожая вещь произошла, когда я попытался напечатать массив Person
объектов:
Person[] people = //...
System.out.println(people);
Я получил вывод: [Lcom.foo.Person;@28a418fc
Что означает этот вывод? Как изменить этот вывод, чтобы он содержал имя моего человека? А как мне распечатать коллекции моих предметов?
Примечание : это подразумевается как канонический вопрос и ответ на этот вопрос.
Ответы:
Задний план
Все объекты Java имеют
toString()
метод, который вызывается при попытке печати объекта.Этот метод определен в
Object
классе (суперкласс всех объектов Java).Object.toString()
Метод возвращает довольно уродливый ищет строку, состоящую из имени класса, с@
символом и хэш - код объекта в шестнадцатеричном формате. Код для этого выглядит так:Таким
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()
метод в вашем собственном классе. Вот простой пример:Теперь, если мы напечатаем
Person
, мы увидим их имя, а неcom.foo.Person@12345678
.Имейте в виду, что
toString()
это только один из способов преобразования объекта в строку. Обычно этот вывод должен полностью описывать ваш объект в четкой и сжатой форме. ЛучшеtoString()
для нашегоPerson
класса может быть:Который напечатал бы, например
Person[name=Henry]
. Это действительно полезная часть данных для отладки / тестирования.Если вы хотите сосредоточиться только на одном аспекте вашего объекта или включить много джазового форматирования, вам может быть лучше вместо этого определить отдельный метод, например
String toElegantReport() {...}
.Автогенерация вывода
Многие IDE поддерживают автоматическую генерацию
toString()
метода на основе полей в классе. См. Документы для Eclipse и IntelliJ , например.Несколько популярных библиотек Java также предлагают эту функцию. Вот некоторые примеры:
ToStringBuilder
от Apache Commons LangMoreObjects.ToStringHelper
из Google Guava@ToString
аннотация от проекта ЛомбокПечать групп объектов
Итак, вы создали хороший
toString()
для вашего класса. Что произойдет, если этот класс будет помещен в массив или коллекцию?Массивы
Если у вас есть массив объектов, вы можете вызвать
Arrays.toString()
простое представление содержимого массива. Например, рассмотрим этот массивPerson
объектов:Примечание: это вызов статического метода, вызываемого
toString()
в классе Arrays, который отличается от того, что мы обсуждали выше.Если у вас есть многомерный массив , вы можете использовать
Arrays.deepToString()
для достижения того же вида вывода.Коллекции
Большинство коллекций будет производить симпатичный вывод, основанный на вызове
.toString()
каждого элемента.Так что вам просто нужно убедиться, что ваши элементы списка определяют красивый,
toString()
как обсуждалось выше.источник
return String.format( getClass().getSimpleName() + "[ name=%s ]", name);
и действительно вместоname
него следует использовать получательgetName()
(но получатели были исключены в классе Person ...), но если использовался получатель ...return String.format( getClass().getSimpleName() + "[ name=%s ]", getName());
Arrays.toString()
так что вы можете использовать его и для массивов примитивов (int[]
,double[]
). ТакжеArrays.deepToString()
хорошо обрабатывает многомерные массивы примитивов.Я думаю, что Apache предоставляет лучший класс утилит, который предоставляет функцию для получения строки
источник
У каждого класса в Java есть
toString()
метод по умолчанию, который вызывается, если вы передаете некоторый объект этого классаSystem.out.println()
. По умолчанию этот вызов возвращает className @ hashcode этого объекта.Вы можете переопределить метод toString класса, чтобы получить другой вывод. Смотрите этот пример
источник
[Lcom.foo.Person;@28a418fc
качестве вывода: это тоже выводtoString()
метода, но того, который реализован в классе, который генерируется во время выполнения для типаPerson[]
, а неPerson
(см. stackoverflow.com/a/8546532/1542343 ).В Eclipse перейдите в свой класс, щелкните правой кнопкой мыши -> source-> Generate
toString()
;Он переопределит
toString()
метод и напечатает объект этого класса.источник
Я предпочитаю использовать служебную функцию, которая использует GSON для десериализации объекта Java в строку JSON.
источник
return Gson.toJson(object);
, иначе работают отлично.В intellij вы можете автоматически сгенерировать метод toString, нажав alt + inset и затем выбрав toString (). Это выход для тестового класса:
Как вы можете видеть, он генерирует String путем объединения нескольких атрибутов класса, для примитивов он будет печатать их значения, а для ссылочных типов он будет использовать их тип класса (в данном случае для строкового метода Test2).
источник
По умолчанию каждый объект в Java имеет
toString()
метод, который выводит ObjectType @ HashCode.Если вам нужна более значимая информация, вам нужно переопределить
toString()
метод в вашем классе.Теперь, когда вы печатаете объект person, используя
System.out.prtinln(personObj);
его, выведите имя человека вместо имени класса и хэш-кода.Во втором случае, когда вы пытаетесь напечатать массив, он печатает
[Lcom.foo.Person;@28a418fc
тип Array и его хэш-код.Если вы хотите напечатать имена людей, есть много способов.
Вы можете написать свою собственную функцию, которая повторяет каждого человека и печатает
Вы можете распечатать его с помощью Arrays.toString (). Это кажется самым простым для меня.
Вы можете напечатать его в формате Java 8 (используя потоки и ссылку на метод).
Могут быть и другие способы. Надеюсь это поможет. :)
источник
Если вы напрямую печатаете какой-либо объект личности, он будет
ClassName@HashCode
в коде.в вашем случае
com.foo.Person@2f92e0f4
печатается. ГдеPerson
класс, к которому принадлежит объект, и2f92e0f4
hashCode объекта.Теперь, если вы попытаетесь использовать объект,
Person
то он напечатает имяисточник
Если вы посмотрите на класс Object (родительский класс всех классов в Java), реализация метода toString () будет
всякий раз, когда вы печатаете какой-либо объект в Java, вызывается toString (). Теперь вам решать, если вы переопределите toString (), тогда ваш метод вызовет другой вызов метода класса Object.
источник