Ich habe eine Klasse wie folgt definiert:
public class Person {
private String name;
// constructor and getter/setter omitted
}
Ich habe versucht, eine Instanz meiner Klasse zu drucken:
System.out.println(myPerson);
aber ich habe folgende ausgabe bekommen : com.foo.Person@2f92e0f4
.
Ähnliches geschah, als ich versuchte, eine Reihe von Person
Objekten zu drucken :
Person[] people = //...
System.out.println(people);
Ich habe die Ausgabe bekommen: [Lcom.foo.Person;@28a418fc
Was bedeutet diese Ausgabe? Wie ändere ich diese Ausgabe so, dass sie den Namen meiner Person enthält? Und wie drucke ich Sammlungen meiner Objekte?
Hinweis : Dies ist als kanonische Frage und Antwort zu diesem Thema gedacht.
Antworten:
Hintergrund
Alle Java-Objekte verfügen über eine
toString()
Methode, die aufgerufen wird, wenn Sie versuchen, das Objekt zu drucken.Diese Methode wird in der
Object
Klasse definiert (der Oberklasse aller Java-Objekte). DieObject.toString()
Methode gibt eine ziemlich hässlich aussehende Zeichenfolge zurück, die aus dem Namen der Klasse, einem@
Symbol und dem Hashcode des Objekts hexadezimal besteht. Der Code dafür sieht so aus:Ein Ergebnis wie
com.foo.MyType@2f92e0f4
kann daher erklärt werden als:com.foo.MyType
- Der Name der Klasse, dh die Klasse befindet sichMyType
im Paketcom.foo
.@
- verbindet die Zeichenfolge miteinander2f92e0f4
der Hashcode des Objekts.Der Name der Array-Klassen sieht etwas anders aus, was in den Javadocs für gut erklärt wird
Class.getName()
. Zum Beispiel[Ljava.lang.String
bedeutet:[
- ein eindimensionales Array (im Gegensatz zu[[
oder[[[
usw.)L
- Das Array enthält eine Klasse oder Schnittstellejava.lang.String
- die Art der Objekte im ArrayAnpassen der Ausgabe
Um beim Aufruf etwas anderes zu drucken
System.out.println(myObject)
, müssen Sie die Methode in Ihrer eigenen Klasse überschreibentoString()
. Hier ist ein einfaches Beispiel:Wenn wir nun a drucken
Person
, sehen wir eher ihren Namen alscom.foo.Person@12345678
.Beachten Sie, dass dies
toString()
nur eine Möglichkeit ist, ein Objekt in eine Zeichenfolge zu konvertieren. In der Regel sollte diese Ausgabe Ihr Objekt klar und präzise beschreiben. Ein besserestoString()
für unserePerson
Klasse könnte sein:Welches würde drucken, z
Person[name=Henry]
. Das sind wirklich nützliche Daten zum Debuggen / Testen.Wenn Sie sich nur auf einen Aspekt Ihres Objekts konzentrieren oder viel jazzige Formatierung verwenden möchten, ist es möglicherweise besser, stattdessen eine separate Methode zu definieren, z
String toElegantReport() {...}
.Ausgabe automatisch generieren
Viele IDEs bieten Unterstützung für die automatische Generierung einer
toString()
Methode basierend auf den Feldern in der Klasse. Siehe zum Beispiel Dokumente für Eclipse und IntelliJ .Einige beliebte Java-Bibliotheken bieten diese Funktion ebenfalls an. Einige Beispiele sind:
ToStringBuilder
von Apache Commons LangMoreObjects.ToStringHelper
von Google Guava@ToString
Anmerkung aus dem Projekt LombokDrucken von Objektgruppen
Sie haben also ein schönes
toString()
für Ihre Klasse erstellt. Was passiert, wenn diese Klasse in ein Array oder eine Sammlung eingefügt wird?Arrays
Wenn Sie ein Array von Objekten haben, können Sie aufrufen
Arrays.toString()
, um eine einfache Darstellung des Inhalts des Arrays zu erstellen. Betrachten Sie beispielsweise dieses Array vonPerson
Objekten:Hinweis: Dies ist ein Aufruf einer statischen Methode, die
toString()
in der Arrays-Klasse aufgerufen wird und sich von der oben beschriebenen unterscheidet.Wenn Sie ein mehrdimensionales Array haben , können Sie
Arrays.deepToString()
dieselbe Art von Ausgabe erzielen.Sammlungen
Die meisten Sammlungen erzeugen eine hübsche Ausgabe, wenn
.toString()
jedes Element aufgerufen wird.Sie müssen also nur sicherstellen, dass Ihre Listenelemente ein schönes definieren,
toString()
wie oben beschrieben.quelle
return String.format( getClass().getSimpleName() + "[ name=%s ]", name);
und wirklich stattdessenname
sollte der Getter verwendet werdengetName()
(aber Getter wurden in der Person-Klasse weggelassen ...), aber wenn ein Getter verwendet wurde ...return String.format( getClass().getSimpleName() + "[ name=%s ]", getName());
Arrays.toString()
sodass Sie sie auch für Arrays von Grundelementen verwenden können (int[]
,double[]
). AuchArrays.deepToString()
Griffe multidimensionalen Arrays von Primitiven schön.Ich denke, Apache bietet eine bessere util-Klasse, die eine Funktion zum Abrufen des Strings bietet
quelle
Jede Klasse in Java enthält
toString()
standardmäßig die Methode, die aufgerufen wird, wenn Sie ein Objekt dieser Klasse an übergebenSystem.out.println()
. Standardmäßig gibt dieser Aufruf den Klassennamen @ Hashcode dieses Objekts zurück.Sie können die toString-Methode einer Klasse überschreiben, um eine andere Ausgabe zu erhalten. Siehe dieses Beispiel
quelle
[Lcom.foo.Person;@28a418fc
als Ausgabe erhalten wird: Dies ist auch die Ausgabe dertoString()
Methode, aber derjenigen, die in der Klasse implementiert ist, die zur Laufzeit für den Typ generiert wirdPerson[]
, nichtPerson
(siehe stackoverflow.com/a/8546532/1542343 ).Gehen Sie in Eclipse zu Ihrer Klasse. Klicken Sie mit der rechten Maustaste auf> Quelle-> Generieren
toString()
.Es überschreibt die
toString()
Methode und druckt das Objekt dieser Klasse.quelle
Ich bevorzuge die Verwendung einer Dienstprogrammfunktion, die GSON verwendet, um das Java-Objekt in eine JSON-Zeichenfolge zu de-serialisieren.
quelle
return Gson.toJson(object);
, sonst perfekt funktionieren.In Intellij können Sie die toString-Methode automatisch generieren, indem Sie Alt + Inset drücken und dann toString () auswählen. Hier ist eine Ausgabe für eine Testklasse:
Wie Sie sehen können, wird ein String generiert, indem mehrere Attribute der Klasse verkettet werden. Bei Grundelementen werden die Werte gedruckt, und bei Referenztypen wird der Klassentyp verwendet (in diesem Fall die String-Methode von Test2).
quelle
Standardmäßig verfügt jedes Objekt in Java über die
toString()
Methode, die den ObjectType @ HashCode ausgibt.Wenn Sie aussagekräftigere Informationen wünschen, müssen Sie die
toString()
Methode in Ihrer Klasse überschreiben .Wenn Sie nun das Personenobjekt
System.out.prtinln(personObj);
damit drucken, wird der Name der Person anstelle des Klassennamens und des Hashcodes gedruckt.In Ihrem zweiten Fall, wenn Sie versuchen, das Array zu drucken, wird
[Lcom.foo.Person;@28a418fc
der Array-Typ und sein Hashcode gedruckt.Wenn Sie die Personennamen drucken möchten, gibt es viele Möglichkeiten.
Sie können Ihre eigene Funktion schreiben, die jede Person iteriert und druckt
Sie können es mit Arrays.toString () drucken. Das scheint mir am einfachsten zu sein.
Sie können es auf Java 8-Weise drucken (unter Verwendung von Streams und Methodenreferenzen).
Es könnte auch andere Wege geben. Hoffe das hilft. :) :)
quelle
Wenn Sie direkt ein Objekt der Person drucken, wird
ClassName@HashCode
es zum Code.in Ihrem Fall
com.foo.Person@2f92e0f4
wird gedruckt. WoPerson
ist eine Klasse, zu der das Objekt gehört, und2f92e0f4
ist der Hashcode des Objekts ?Wenn Sie nun versuchen, das Objekt von zu verwenden
Person
, wird der Name gedrucktquelle
Wenn Sie sich die Object-Klasse (übergeordnete Klasse aller Klassen in Java) ansehen, lautet die Implementierung der toString () -Methode
Wenn Sie ein Objekt in Java drucken, wird toString () aufgerufen. Wenn Sie toString () überschreiben, liegt es nun an Ihnen, dass Ihre Methode einen anderen Methodenaufruf für die Objektklasse aufruft.
quelle