Beim Erstellen eines Programms ist es häufig erforderlich, den Inhalt eines Objekts herauszufinden. Zu diesem Zweck definiert die Java- Object- Klasse, die grundlegendste Java-Klasse in der Klassenhierarchie, eine spezielle toString()- Methode. Es gibt eine Zeichenfolge zurück, die das Objekt beschreibt. Die Standardimplementierung der toString() -Methode in Java erzeugt eine Ausgabe wie diese:
package.class@hashCode
dh toString , das in java.lang.Object definiert wurde, gibt den Hash-Code des Objekts in hexadezimaler Form an. Dies ist oft nicht sehr klar und nützlich. Beim Erstellen einer neuen Klasse ist es daher üblich, toString() zu überschreiben, sodass der Rückgabestring den Klassennamen, die Namen und die Werte aller Variablen enthält. Das korrekte Überschreiben der toString- Methode kann beim Protokollieren und Debuggen eines Java-Programms hilfreich sein und wertvolle und wichtige Informationen liefern. Einfach ausgedrückt wird die toString() -Methode in Java verwendet, um ein String-Objekt abzurufen, das den Wert eines numerischen Objekts darstellt. Mit anderen Worten: Es wandelt eine Zahl in eine Zeichenfolge um. Wenn die Methode einen einfachen Datentyp als Argument akzeptiert, wird ein String-Objekt zurückgegeben, das den Wert des einfachen Datentyps darstellt.
Beispiel einer Java-toString()-Methode
Wenn Sie eine Klasse erstellen, müssen Sie normalerweise zusätzlich zur toString() -Methode in Java die Methoden equal , hashCode und CompareTo überschreiben, um zu wissen, wie mit ihren Objekten gearbeitet wird. Aber konzentrieren wir uns zunächst auf toString . In den meisten Fällen ist die Übermittlung von Textinformationen zu einem Objekt recht einfach. Sie müssen lediglich verstehen, was genau der Benutzer bei der Protokollierung sehen möchte. Lassen Sie uns ein Beispiel geben und eine Klasse erstellen, die einen Punkt auf der Ebene beschreibt. Es hat zwei Koordinaten: KoordinatenX, KoordinatenY. Natürlich sollten sie auf dem Bildschirm angezeigt werden, wenn ein Benutzer fragt „Was für ein Objekt ist das?“, genau wie der Name der Klasse selbst. Das werden wir in der überschriebenen toString()- Methode demonstrieren. Jetzt erstellen wir die Klasse selbst, ihre Felder (Koordinaten), einen Konstruktor und Getter zum Erhalten von Koordinaten (natürlich ist es möglich, sie nicht zu erstellen, aber vom Standpunkt der korrekten Verwendung von OOP sind Getter eine gute Praxis). Zur Veranschaulichung erstellen wir auch eine Methode, die einen neuen Punkt erstellt – die Summe der beiden anderen – und überschreiben auch die Methoden „equals“ und „ hashCode“ .public class Point implements Comparable<Point> {
private final int coordinateX;
private final int coordinateY;
public Point(final int coordinateX, final int coordinateY) {
this.coordinateX = coordinateX;
this.coordinateY = coordinateY;
}
public int getX() {
return coordinateX;
}
public int getY() {
return coordinateY;
}
public Point sum(final Point that) {
return new Point(coordinateX + that.coordinateX, coordinateY + that.coordinateY);
}
// here we override toString with coordinates and class name
@Override
public String toString() {
return "Point{"
+ "X: " + getX()
+ ", Y: " + getY()
+ '}';
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (o == null || o.getClass() != this.getClass()) {
return false;
}
@Override
public int hashCode() {
return coordinateX + coordinateY;
}
Jetzt erstellen wir eine Testklasse und eine Hauptmethode. Da haben wir zwei Punkte und den dritten, den wir aus der Summe von zwei Punkten bekommen. Wir wenden die toString- Methode bis zu diesem Punkt an und drucken sie aus.
//toString() method demo
public class Test {
public static void main(String[] args) {
Point myPoint1 = new Point(5,7);
Point myPoint2 = new Point(-2, 8);
Point mySum = myPoint1.sum(myPoint2);
//call toString explicitly
System.out.println(mySum.toString());
}
}
Das Ergebnis dieser Programmarbeit ist unten:
Punkt{X: 3, Y: 15}
Sie müssen die toString- Methode nicht explizit aufrufen und tun dies in den meisten Fällen auch nicht. Um die Methode toString() aufzurufen , übergeben Sie einfach das gewünschte Objekt an System.out.println . Unsere Testklasse wird also so aussehen:
//toString method demo
public class Test {
public static void main(String[] args) {
Point myPoint1 = new Point(5,7);
Point myPoint2 = new Point(-2, 8);
Point mySum = myPoint1.sum(myPoint2);
//call toString implicitly
System.out.println(mySum);
}
}
Die Ausgabe des Programms ist die gleiche wie zuvor. Was ist, wenn wir die toString- Methode nicht überschreiben , das Objekt aber drucken möchten? In diesem Fall wird die toString- Methode der Object- Klasse aufgerufen. Wenn wir in unserem Beispiel die toString- Methode aus unserer Point- Klasse entfernen und in der Testklasse alles so belassen, wie es ist, erhalten wir das folgende Ergebnis:
Punkt@12
Hier haben wir den Hash-Code des Objekts im Hexadezimalformat.