Die toString()-Methode scheint unscheinbar. Sie verfügt jedoch über eine große Kraft, die dir helfen kann! Denn jedes Objekt in Java hat eine toString()-Methode. Du wirst lernen, wie du sie verwenden kannst. Ebenso wie du deine eigene toString()-Methode implementieren kannst.
Das Wichtigste in Kürze! 💡
System.out.println()
, da dort eine String erwartet wird.Nun betrachten wir uns die toString()-Methode einmal im Detail. Anschließende kannst du die Methode komplett durchblicken und anwenden.
Die toString()-Methode anzuwenden, ist einfach. Den die Methode hat keine Übergabeparameter, sondern gibt immer nur einen String zurück. Als Beispiel habe ich folgende Klasse Country
erstellt, die ein Land repräsentieren soll. Dort haben wir ein Feld für die Anzahl der Bevölkerung in Millionen, das Gründungsjahr und nicht zu vergessen für den Namen angelegt.
public class Country {
private String name;
private int population;
private GregorianCalendar foundingYear;
Country(String name, int population,GregorianCalendar foundingYear) {
this.name = name;
this.population = population;
this.foundingYear = foundingYear;
}
}
Jetzt möchten wir einmal die toString()-Methode aufrufen. Du wirst dabei feststellen, dass die Ausgabe erst einmal nicht sonderlich aussagekräftig ist. Wichtig ist, dass du für die System.out.print<*>
Methoden nicht unbedingt die toString()-Methode selbst aufrufen musst. Der Grund ist, dass die toString()-Methode durch Java automatisch ausgeführt wird, wenn ein Objekt an die Print-Methoden übergeben wird.
GregorianCalendar date = new GregorianCalendar(1949, Calendar.JANUARY, 1);
Country germany = new Country("Deutschland", 83, date);
System.out.println(germany.toString());
System.out.println(germany);
Als Ausgabe wirst du jetzt so etwas wie Country@13fee20c
erhalten. Das liegt an der Standardimplementierung der Klasse Object
. Jede eigene Klasse – also auch unsere Klasse Country
– erbt automatisch von der Klasse Objekt
und verfügt deshalb über diese Standardimplementierung der toString()-Methode. Die Implementierung sieht vor, dass der Klassenname von einem Hash gefolgt wird. Wie die Implementierung aussieht, siehst du im folgenden Codebeispiel. Der Hash identifiziert ein Objekt eindeutig. Das bedeutet, wenn zwei Objekte den gleichen Hash besitzen, ist es zweimal das gleiche Objekt.
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode()); // "Country" + "@" + "13fee20c"
}
Nachdem wir nun das Standardverhalten kennengelernt haben, wollen wir in unserer Country
-Klasse die toString()-Methode überschreiben. Der String der Standardimplementierung sieht sehr kryptisch aus und gibt uns auch keine Information über das Objekt. Wenn wir die toString()-Methode überschreiben, können wir selber implementieren, wie der String aussehen soll. Für unsere Klasse Country
könnten wir einen aussagekräftigen String erstellen, der uns beschreibt, um welches Land es geht, die Anzahl der Bevölkerung und wann es gegründet wurde. Diesen String könnte man dann zum Beispiel auch in einem Log-File schreiben. Die Implementierung unserer toString()-Methode könnte zum Beispiel so aussehen:
@Override
public String toString() {
return String.format("[%s] Bevölkerung in Millionen: %d - Gegründet: %d",name,population,foundingYear.get(Calendar.YEAR));
}
Letztlich kannst du eine Methode toString() mit dem Return Typ String
und public
anlegen, anschließende kannst du dein Verhalten programmieren, wie du den String erhalten möchtest. Wie bereits beschrieben, wollen wir als Erstes das Land, gefolgt von der Bevölkerung und dem Gründungsjahr erhalten.
Eine Ausgabe könnte nun zum Beispiel so aussehen, wie hier für Deutschland und die Niederlande:
[Deutschland] Bevölkerung in Millionen: 83 - Gegründet: 1949
[Niederlande] Bevölkerung in Millionen: 17 - Gegründet: 1581
Zusätzlich siehst du hier noch das Keyword @Override
. Diese gehört zum guten Programmierstil in Java. Deine IDE – ich verwende zum Beispiel IntelliJ – setzt diese auch automatisch beim Erstellen der toString()-Methode. Es hilft einen Überblick darüber zu gewinnen, dass man gerade eine Methode überschreibt. Ein weiter Grund für @Override
ist, dass der Compiler einen warnt, wenn ein Methodensignatur „überschrieben“ wird, die keines der Elternklassen besitzt. Ein Beispiel könnte sein, dass ein Methodenname falsch geschrieben oder einen Parameter vergessen wurde. In beiden Fällen würde der Compiler uns darauf aufmerksam machen, dass die Methode keine Methode einer Elternklasse überschreibt.
Wir haben in diesem Artikel gelernt, dass die toString()-Methode eher für das Logging und Debugging geeignet ist. Wenn wir jedoch einen String unseres Objektes sauber formatiert in ein Interface ausgeben wollen, sollten wir sie nicht verwenden. In einer eigenen Methode kannst du hierzu hervorragend auf die String.format()
Funktion zurückgreifen. Denn die System.out.print
-Methoden greifen immer auf die toString()-Methode zurück – was ungünstig ist, falls beim Debuggen nur eine Information angezeigt wird, die für den Nutzer im Frontend bestimmt ist.
Hinterlasse mir gerne einen Kommentar zum Artikel und wie er dir weitergeholfen hat beziehungsweise, was dir helfen würde das Thema besser zu verstehen. Oder hast du einen Fehler entdeckt, den ich korrigieren sollte? Schreibe mir auch dazu gerne ein Feedback!
Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "Wie die toString()-Methode in Java funktioniert!"!