Этот метод определен в 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 означает:
[ - одномерный массив (в отличие от [[ or [[[ и т.д.)
L - массив содержит класс или интерфейс
java.lang.String - тип объектов в массиве
Настройка выходных данных
Чтобы напечатать что-то другое при вызове System.out.println(myObject), вы должны переопределитьtoString() метод в вашем собственном классе. Вот простой пример.:
publicclassPerson {
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 также предлагают эту функцию. Некоторые примеры включают:
Итак, вы создали nice toString() для своего класса. Что произойдет, если этот класс поместить в массив или коллекцию?
Массивы
Если у вас есть массив объектов, вы можете вызвать Arrays.toString(), чтобы создать простое представление содержимого массива. Например, рассмотрим этот массив Person объектов:
Person[] people = { newPerson("Fred"), newPerson("Mike") }; System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
Примечание: это вызов статического метода, вызываемого toString() в классе Arrays , который отличается от того, что мы обсуждали выше.
Если у вас есть многомерный массив, вы можете использовать Arrays.deepToString() для получения такого же результата.
Коллекции
Большинство коллекций выдают красивые выходные данные, основанные на вызове .toString() для каждого элемента.
List<Person> people = newArrayList<>(); people.add(newPerson("Alice")); people.add(newPerson("Bob")); System.out.println(people);
// Prints [Alice, Bob]
Итак, вам просто нужно убедиться, что элементы вашего списка определяют nice toString() как обсуждалось выше.
Ответ 2
Я думаю, что apache предоставляет лучший util-класс, который предоставляет функцию для получения строки
ReflectionToStringBuilder.toString(object)
Ответ 3
В каждом классе Java по умолчанию есть toString() метод, который вызывается, если вы передаете какой-либо объект этого класса в System.out.println(). По умолчанию этот вызов возвращает className@hashcode этого объекта.
{ SomeClasssc=newSomeClass(); // Class @ followed by hashcode of object in Hexadecimal System.out.println(sc); }
Вы можете переопределить метод toString класса, чтобы получить другой результат. Смотрите этот пример.
classA { Strings="I am just a object"; @Override public String toString() { return s; } }