Eine toString-Methode, die eine Zeichenfolgendarstellung eines Objekts in Java zurückgibt. Normalerweise benutze ich es richtig, aber ich habe die Implementierung des Inhalts überprüft
Hoge.java
public class Hoge{
@Override
public String toString(){
return "Diese Klasse ist die Hoge-Klasse.";
}
}
Test1.java
public class Test1{
public static void main(String[] args){
Object hoge = new Hoge();
System.out.println(hoge);
}
}
Wenn Sie die toString-Methode wie folgt überschreiben, Es ist eine praktische Funktion, die gute Dinge anzeigt, indem sie einfach in das Argument des Drucks eingefügt wird. (Die Berechnung, wenn sie als Zeichenfolge interpretiert werden kann, wird ebenfalls gut verarbeitet.)
Dieses Mal möchte ich diese Implementierung bestätigen.
Zunächst aus Dokumentbeschreibung.
Gibt eine Zeichenfolgendarstellung des Objekts zurück. Im Allgemeinen gibt die toString-Methode eine Zeichenfolge zurück, die dieses Objekt "textuell darstellt". Dieses Ergebnis sollte präzise und informativ für die menschliche Lesbarkeit sein. Wir empfehlen, diese Methode für alle Unterklassen zu überschreiben. Die toString-Methode der Klasse Object gibt eine Zeichenfolge zurück, die aus dem Namen der ursprünglichen Klasse, in der das Objekt eine Instanz ist, dem Atmark-Zeichen "@" und einer vorzeichenlosen hexadezimalen Darstellung des Hash-Codes des Objekts besteht. Das heißt, diese Methode gibt eine Zeichenfolge zurück, die den folgenden Werten entspricht:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Die toString-Methode ist standardmäßig in der Object-Klasse implementiert Der Klassenname und der Hash-Code werden angezeigt.
Die Object-Klasse ist eine Oberklasse aller Java-Klassen. Alle Klassen haben eine toString-Methode.
Die toString-Methode wird normalerweise so behandelt Ich schätzte.
Lassen Sie uns überprüfen, ob diese Hypothese richtig ist.
Zum Beispiel die Implementierung von System.out.println
Daher, wenn Object als Argument verwendet wird Überprüfen der Implementierung von System.out.println,
PrintStream.java
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
Auf diese Weise rufen wir Object # valueOf () auf.
String.java
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
Überprüfen der Implementierung der String-Klasse, Wenn das Argumentobjekt nicht null ist, wird toString aufgerufen. (Vermeiden Sie NullPointer)
Das Verknüpfen mit dem Zeichenfolgenverbindungsoperator basiert auf der "Java-Sprachspezifikation".
Die Verarbeitung ist je nach Version unterschiedlich.
Da es kompliziert ist, werde ich die Details weglassen, aber durch den String-Join-Operator +
Der Code scheint hinter den Kulissen als StringBuilder.append () behandelt zu werden.
Das Bild sieht so aus.
Test2.java
public class Test2{
public static void main(String[] args){
"time: " + new Date();
// new StringBuilder().append("time: ").append(new Date());
}
}
Lassen Sie uns daher die Implementierung von StringBuilder überprüfen.
StringBuilder.java
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
Ah...
# Apropos
Das Array zeigt nicht den Inhalt der Liste an, die Array-Liste jedoch.
Manchmal ist es schwer, einen Fehler zu machen.
ArrayList-Oberklasse, AbstractCollection
Ich habe toString überschrieben.
#### **`AbstractCollection.java`**
```java
public String toString() {
Iterator<E> it = iterator();
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next();
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
```
Anscheinend [wird das Array durch die Sprachspezifikation definiert](https://docs.oracle.com/javase/specs/jls/se10/html/jls-10.html#jls-10.7)
Wenn man das betrachtet, fühlt es sich so an, weil die toString-Methode nicht überschrieben wird.
```java
class A<T> implements Cloneable, java.io.Serializable {
public final int length = X;
public T[] clone() {
try {
return (T[])super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e.getMessage());
}
}
}
```
Die Länge, die Anfänger zum Weinen gebracht hat, war in Ihrer Öffentlichkeit endgültig ...
# Am Ende
toString Bequem.
Recommended Posts