toSring()-Methode

sk72

Mitglied
Hallo,

kann mir einer genauer erklären, was die toString-Methode macht, sobald ich sie überschreibe?

Ist es so, dass es den Objekten der Klasse den Rückgabewert der toString()-Methode als "Namen" gibt, wie das folgende Bsp. zeigt:

Java:
public class Test 
{
	private int x;
	private int y;
	
	public Test(int x, int y)
	{
		this.x = x;
		this.y = y;
	}
		
	public static void main(String[] args)
	{
		Test t = new Test(5,8);
		System.out.println(t);				// Test
	}
	
	@Override
	public String toString()
	{
		return "Test";
	}
	
}
 

Clayn

Aktives Mitglied
Sie wird einfach aufgerufen wenn quasi eine String Beschreibung eines Objekts nötig ist wie zum Beispiel bei System.out.println().

Was allerdings die Beschreibung ist, ist dir überlassen. Das kann einfach nur der Name der Klasse sein oder wie bei java.awt.Color z.B. noch zusätzlich die Farbwerte.

Allerdings sollte die Beschreibung einigermaßen sinnvollsein.

Bei deinem Beispiel würde jedes Objekt der Klasse Test immer beim ausgeben "Test" anzeigen.
Da wäre zum Beispiel noch eine einbeziehung von x und y sinnvoll da dies die Objekte unterscheidet
 
N

nillehammer

Gast
Die toString-Methode ist gedacht, um eine String-Repräsentation eines Objekts zu erhalten. Der String enthält wünschenswerterweise informative Daten. In der undüberschriebenen Standardimplementierung sieht man nur eine Objekt-Id. In der überschriebenen Variante würde man dort den Wert von Instanzvariablen unterbringen. In Deinem konkreten Beispiel also bspw so:
Java:
@Override
public final String toString() {
 return new StringBuilder("Test:").append("x=").append(this.x)
   .append(",y=").append(this.y).toString();
}
So kann man für debugging-Zwecke bspw. durch Aufruf der toString-Methode den Status eines Objekts loggen oder mit System.out.println anzeigen.
 

Landei

Top Contributor
Java:
@Override
public final String toString() {
 return new StringBuilder("Test:").append("x=").append(this.x)
   .append(",y=").append(this.y).toString();
}

Is nich dein Ernst, oder? Das ist das reinste Cargo Cult Programming: Das mit dem [c]StringBuilder[/c] bekommt der Compiler bei so einfachen Konstellationen selbst hin (in einer Schleife wäre das was anderes), der einzige Effekt ist, dass deine Version dadurch unübersichtlich wird. Außerdem wird eine [c]toString[/c]-Methode typischerweise nicht zehn Millionen mal in einer engen Schleife aufgerufen - selbst wenn es so ein wenig schneller wäre, würde es nicht ins Gewicht fallen, also ein Fall von Premature Optimization.

Ich fände das am am hypschesten:

Java:
@Override
public final String toString() {
  return String.format("Test: x=%d, y=%d", x, y);
}
 
Zuletzt bearbeitet:
H

hüteüberhüte

Gast
[OT]
The term cargo cult, as an idiom, originally referred to aboriginal religions which grew up in the South Pacific after World War II. The practices of these groups centered on building elaborate mock-ups of airplanes and military landing strips in the hope of summoning the god-like airplanes that had brought marvelous cargo during the war.
:D[/OT]

Back on topic: Viele Methoden rufen auf einem übergeben Objekt toString() auf, um eine textuelle Beschreibung des Objekts zu erhalten. toString() ist eine Methode von Object und wird deshalb an alle Klassen vererbt. Sie sollte nach Möglichkeit den aktuellen Zustand des Objekts zurückgeben (Klassenname, Werte der Attribute usw.)
 
Zuletzt bearbeitet von einem Moderator:

Neomatrix433

Mitglied
Java:
    @Override
    public String toString() {
	return "Test [x=" + x + ", y=" + y + "]";
    }

Bitte macht nicht solche Sachen wie String.format(..... oder gar irgendwelche Schleifenkonstrukte in der toString()!!!!

Die 3 Methoden die immer überschrieben werden sollten sind: hashCode(), equals(Object obj) und toString()-Methode!!

Was dann wie folgt aussehen sollte:
Java:
package de.berlin.matrix.blue.core;

public class Test {

    private int x;
    private int y;

    @Override
    public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + x;
	result = prime * result + y;
	return result;
    }

    @Override
    public boolean equals(Object obj) {
	if (this == obj)
	    return true;
	if (obj == null)
	    return false;
	if (getClass() != obj.getClass())
	    return false;
	Test other = (Test) obj;
	if (x != other.x)
	    return false;
	if (y != other.y)
	    return false;
	return true;
    }

    @Override
    public String toString() {
	return "Test [x=" + x + ", y=" + y + "]";
    }

    public Test(int x, int y) {
	this.x = x;
	this.y = y;
    }

    public static void main(String[] args) {
	Test t = new Test(5, 8);
	System.out.println(t); // Test
    }
}

Die Methode toString() liefert wie eben gesagt wurde eine für Menschen lesbare Repräsentation des Objektes auf ganz ganz simple weise hier wäre die Ausgabe: Test [x=5, y=8].
Wenn man die toString() nicht überschreibt bekommt man: de.berlin.matrix.blue.core.Test@464 (Das ist der fullqualifidname also packetname.Object getrennt durch @ und dann kommt die ID des erstellten Objektes.

Das ist beim Debuggen sehr schlecht wenn man wissen will wie das Objekt gerade aussieht. Daher immer die toString() so einfach wie möglich überschreiben. Eclipse liefert gleich eine Automatik um diese Methoden generieren zu lassen da es später wirklich zur Tiparbeit wird die Methoden zu schreiben ;-)

Die hashCode() liefert wie der Name schon sagt den HashCode eines Object dieser ist wichtig wenn ein Object serialisiert wird.
Und die equals(Object obj) ist zum vergleichen von Objekten.

Das überschreiben einer Methode wird immer über die Annotation @Override angegeben.

MFG
 

Landei

Top Contributor
Java:
    @Override
    public String toString() {
	return "Test [x=" + x + ", y=" + y + "]";
    }

Bitte macht nicht solche Sachen wie String.format(..... oder gar irgendwelche Schleifenkonstrukte in der toString()!!!!

Was spricht gegen [c]String.format[/c]? Bei komplexeren Objekten wird alles andere schnell unübersichtlich.

Die 3 Methoden die immer überschrieben werden sollten sind: hashCode(), equals(Object obj) und toString()-Methode!!

Nicht immer, sondern wenn es sinnvoll ist. [c]toString[/c] ist fast immer sinnvoll. [c]equals[/c] ist für bestimmte veränderliche Klassen bereits "richtig" (nämlich als ==) implementiert (man denke nur an Klassen, die einfach eine Funktion A->B abbilden, da ist ohne zusätzliche Informationen kein anderer vernünftiger Vergleich möglich). [c]hashCode[/c] braucht man nur dann zu überschreiben, wenn es irgendwie sinnvoll ist, das Objekt als Schlüssel einer [c]HashMap[/c] zu verwenden, was nicht immer der Fall ist. Und wenn man versehentlich veränderliche Felder bei der Berechnung mit einbezieht, ist das Chaos schon programmiert...
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Java:
    @Override
    public String toString() {
	return "Test [x=" + x + ", y=" + y + "]";
    }

Bitte macht nicht solche Sachen wie String.format(..... oder gar irgendwelche Schleifenkonstrukte in der toString()!!!!

Die 3 Methoden die immer überschrieben werden sollten sind: hashCode(), equals(Object obj) und toString()-Methode!!

Was dann wie folgt aussehen sollte:
Java:
//...siehe original Post...

Die Methode toString() liefert wie eben gesagt wurde eine für Menschen lesbare Repräsentation des Objektes auf ganz ganz simple weise hier wäre die Ausgabe: Test [x=5, y=8].
Wenn man die toString() nicht überschreibt bekommt man: de.berlin.matrix.blue.core.Test@464 (Das ist der fullqualifidname also packetname.Object getrennt durch @ und dann kommt die ID des erstellten Objektes.

Das ist beim Debuggen sehr schlecht wenn man wissen will wie das Objekt gerade aussieht. Daher immer die toString() so einfach wie möglich überschreiben. Eclipse liefert gleich eine Automatik um diese Methoden generieren zu lassen da es später wirklich zur Tiparbeit wird die Methoden zu schreiben ;-)

Die hashCode() liefert wie der Name schon sagt den HashCode eines Object dieser ist wichtig wenn ein Object serialisiert wird.
Und die equals(Object obj) ist zum vergleichen von Objekten.

Das überschreiben einer Methode wird immer über die Annotation @Override angegeben.

MFG
Gut gelernt... weiter machen. Sag bescheid, wenn's Zeit ist diese Aussage zu revidieren. ;)
Nein, im Ernst. Landei's Version hat schon was. Ein einziges Stringliteral, zwei Variablen und übersichtlich, besser geht's nicht. Warum sollte man so etwas nicht in "toString()" verwenden? Die Mängel an "hashCode()" spar ich mir aber "equals()" muss noch dran glauben (apropos Glauben... ich kann's kaum glauben, so etwas im Anfänger-Forum als Tip lesen zu müssen):
Java:
class SomeClass {
  // hashCode ist passend überschrieben...

  @Override
  public boolean equals(Object obj) {
    if(this == obj) {
      return true; // kurz und buendig, identische Objekte sind inhaltlich gleich!
    }
    if(obj instanceof SomeClass) {
      SomeClass sc = (SomeClass) obj;
      // vergleichen
      return ergebnis;
    }
    return false;
  }
}
[EDIT]Im übrigen... das man "equals()" und "hashCode()" nicht notwendigerweise überschreiben muss, hat Landei ja bereits erwähnt. Und wenn man eine davon überschreibt, sollte man auch die andere überschreiben.[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
B

bygones

Gast
Java:
    @Override
    public String toString() {
	return "Test [x=" + x + ", y=" + y + "]";
    }

Bitte macht nicht solche Sachen wie String.format(..... oder gar irgendwelche Schleifenkonstrukte in der toString()!!!!
nette Ausrufezeichen - unterstreicht natuerlich ein Argument ohne Beweis.

und allein die equals methode von Eclipse zeigt dass es bei weitem nicht schoen und intuitiv ist...
 

Neomatrix433

Mitglied
Ja ich würde an dieser stelle einfach mal sagen danke an die die mich bis auf das kleinste berichtigt haben. Da kann ich dann nichts mehr hinzufügen.

Es geht mit der Automatik von Eclipse einfach schneller und Zeit ist Geld :D wenn es einem dann nicht so passt kann man die Methoden eh noch anpassen. Und es sind letztlich alles Sachen die zum Programmierstil gehören (String.format.... oder schleife in der toString()) und den sollte man wenn man im Team arbeitet absprechen. Hab ihr hier im Forum CODE-CONVENTION, Code-Syleguidelines angegeben an die man sich hier halten muss?? Dann hab ich die überlesen ;-) [EDIT]Im übrigen... das man "equals()" und "hashCode()" nicht notwendigerweise überschreiben muss, hat Landei ja bereits erwähnt. Und wenn man eine davon überschreibt, sollte man auch die andere überschreiben.[/EDIT] Exakt richtig dann weiter machen bitte.
Und ja ich hab es so gelernt an der Uni was soll ich machen wenn einem das so beigebracht wird Asche auf mein Haupt :D

Sorry für die !!!!!! und das nicht exakte Formulieren.
 
H

hüteüberhüte

Gast
Die 3 Methoden die immer überschrieben werden sollten sind: hashCode(), equals(Object obj) und toString()-Methode!!

Entschuldigung, aber das ist doch Bockmist. hashCode und equals stehen in gar keinem Bezug zu toString. Wenn Objekte nicht miteinander verglichen werden sollen oder aus ihnen kein Hashwert generiert werden soll, macht es keinen Sinn, diese Methoden auch zu überschreiben

Das klingt so à la ich hab da mal was gelesen bezüglich aller möglichen Methoden aus Object, die möglicherweise auch überschreiben werden könnten
 

Neomatrix433

Mitglied
Entschuldigung, aber das ist doch Bockmist. hashCode und equals stehen in gar keinem Bezug zu toString. Wenn Objekte nicht miteinander verglichen werden sollen oder aus ihnen kein Hashwert generiert werden soll, macht es keinen Sinn, diese Methoden auch zu überschreiben

Das klingt so à la ich hab da mal was gelesen bezüglich aller möglichen Methoden aus Object, die möglicherweise auch überschreiben werden könnten

Wat los hier??? Meinen Post nicht richtig gelesen ist doch jetzt klar das mit den Methoden wie oft muss man sich hier entschuldigen??? Wegen nicht exakter Ausdrucks- und Schreibweise!!!
 
H

hüteüberhüte

Gast
Sry, war ein bisschen langsam mit dem Eintippen :D Da inzwischen alles geklärt zu seien scheint, ignoriere meinen Kommentar einfach :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Methoden Ausgabe aller Attribute einer Instanz ohne einzelne Methode Java Basics - Anfänger-Themen 3
hennskand Brauche Hilfe Zwischenzustände von Objekt aus rekursiver Methode speichern Java Basics - Anfänger-Themen 6
foreverqt Fehlermeldung bei Aufruf von Methode Java Basics - Anfänger-Themen 13
T Verschiedene Optionen in der Methode Java Basics - Anfänger-Themen 6
T Rekursive Methode Java Basics - Anfänger-Themen 13
Ü Methode soll Quadrat aus der Summer zurückgeben Java Basics - Anfänger-Themen 10
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
Leyla Spezifischte Methode Java Basics - Anfänger-Themen 16
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
L Variablenwerte aus einer Methode übergeben Java Basics - Anfänger-Themen 2
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
M Methode sperren bis ein Kriterium erfüllt wurde Java Basics - Anfänger-Themen 3
D Switch Case Methode aufrufen Java Basics - Anfänger-Themen 3
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
L Methoden Eine Methode um zu testen ob es ein Nachbar gibt Java Basics - Anfänger-Themen 10
til237 Iterative Methode in rekursive Methode umschreiben Java Basics - Anfänger-Themen 4
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
D next() Methode mehrfach verwenden Java Basics - Anfänger-Themen 1
Ostkreuz Methoden Von Dezimal zu Hexadezimal Methode toHex Java Basics - Anfänger-Themen 2
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
N Throw an Main Methode übergeben Java Basics - Anfänger-Themen 7
M Methoden Methode 'wiederhole' nicht gefunden (Uebersetzungsfehler) Java Basics - Anfänger-Themen 1
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
G Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
T Variable von Objekten in einer Methode überprüfen Java Basics - Anfänger-Themen 26
M Anzahl Kommandozeilenparamter mittels Methode Java Basics - Anfänger-Themen 11
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
G Methode aus dem Aufrufer aufrufen Java Basics - Anfänger-Themen 1
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
D Warum kann ich hier nicht auf die Methode zugreifen? Java Basics - Anfänger-Themen 5
M generate Methode für Streams Java Basics - Anfänger-Themen 6
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
I Optionaler Parameter bei Methode, der nur optional ist? Java Basics - Anfänger-Themen 6
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
T Linked List set-Methode Java Basics - Anfänger-Themen 2
D Arrays an replaceAll-Methode übergeben Java Basics - Anfänger-Themen 12
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
W Equals-Methode überschreiben bei composition Java Basics - Anfänger-Themen 20
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
V Methoden printChar Methode mit Rückgabetyp void Java Basics - Anfänger-Themen 26
F Graph Tiefensuche Methode Java Basics - Anfänger-Themen 7
Jambolo Methode, welche die 3 letzten Parameter Werte speichert Java Basics - Anfänger-Themen 20
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
M Warum return die Methode den Wert nicht Java Basics - Anfänger-Themen 5
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
S Methode Java Basics - Anfänger-Themen 4
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
Liroyd Methode mit Objektvariabel rechnen? Java Basics - Anfänger-Themen 6
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
D Methode um mögliche Rezepte auszugeben Java Basics - Anfänger-Themen 12
U Warum kann ich die Methode in der ENUM Klasse nicht aufrufen? Und warum geht die Switch nicht? Java Basics - Anfänger-Themen 8
J Hallo zusammen , was macht diese Methode hier genau? Java Basics - Anfänger-Themen 3
D Array in Main Methode aus anderer Klasse aufrufen Java Basics - Anfänger-Themen 3
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
G jButton führt Main Methode nicht richtig aus Java Basics - Anfänger-Themen 3
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
C60 Methoden Main-Methode erkennt meine Arrays nicht. Java Basics - Anfänger-Themen 7
A Ein Array bearbeiten und in einer anderen Methode nutzen Java Basics - Anfänger-Themen 6
A Ergebnis einer Methode bei einer anderen verwenden Java Basics - Anfänger-Themen 13
L Iteratorform und Methode mit variabler Parameterzahl Java Basics - Anfänger-Themen 31
F Methode ArrayList mit Eingabewert Java Basics - Anfänger-Themen 2
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
M Wie kann die Implementation einer Methode den Wert eines Attributs vermindern? Java Basics - Anfänger-Themen 3
Csircc Rekursive Methode Stack Overflow Java Basics - Anfänger-Themen 10
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
M Wie verknüpfe ich eine Bedingung mit einer Methode ohne if-Verzweigung & Bedingungsoperator? Java Basics - Anfänger-Themen 2
M Wie kann eine Methode eine andere Methode um Werte wie z.B. 1 erhöhen? Java Basics - Anfänger-Themen 6
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
D mehrere Berechnungen in einer Methode Java Basics - Anfänger-Themen 9
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
J ArrayList add methode selbst programmieren Java Basics - Anfänger-Themen 10
X Methoden Methode zur Punktezählung in Blackjack Java Basics - Anfänger-Themen 2

Ähnliche Java Themen


Oben