Bevor wir zwei Objekte vergleichen, müssen wir zunächst bestimmen, worauf wir vergleichen möchten. Das Objekt enthält so viele Mitgliedsvariablen, dass ein direkter Vergleich unmöglich ist.
1.2 Komparator
In dieser Schnittstelle gibt es eine abstrakte Methode vergleichen, die auch zum Vergleichen von Größen zwischen Objekten verwendet wird. Die Struktur der Methode ist wie folgt:
und ComparableDenken Sie daran, dass der Rückgabewert dieser Methode die Object-Klasse ist um das Ergebnis bei der Verwendung in eine Unterklasse umzuwandeln
2.2 Deep Copy und Shallow Copy
Es muss erklärt werden: ob Eine Klonmethode ist eine tiefe Kopie oder eine flache Kopie, die etwas mit den Mitgliedsvariablen in der Klasse und dem von Ihnen geschriebenen Code zu tun hat. Beide Klassen verwenden dieselbe Klonmethode, eine ist eine tiefe Kopie und die andere ist eine flache Kopie. Diese Situation existiert
Jetzt gibt es eine Klasse wie folgt:
class A implements Cloneable{ int i; int j; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return "{" + "i=" + i + ", j=" + j + '}'; } }
Wir instanziieren sie in der Hauptmethode und klonen sie in ein anderes Objekt. Schauen Sie sich das Ergebnis an:
Zu diesem Zeitpunkt hat sich a aufgrund von nicht geändert Die Änderung von b. clone() ist eine tiefe Kopie. Wir transformieren dann Klasse A:
class B implements Cloneable { int k; } class A implements Cloneable{ int i; int j; B c=new B(); @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return "{" + "i=" + i + ", j=" + j + ", c.k=" + c.k + '}'; } }
Ist der Klon zu diesem Zeitpunkt also eine tiefe oder eine flache Kopie?
Der Grund für dieses Ergebnis hängt vom Speicher ab. Vor der Änderung der Klasse A ist der Speicher wie folgt:
Der geänderte Speicher der Klasse A ist wie folgt: Gemäß dem obigen Bild: Um Deep Copying zu erreichen, ist ein weiterer Klon des Inhalts der Klasse B erforderlich. Daher müssen wir die Klonmethode ändern .ObjektklasseObjektklasse Hier werden einige häufig verwendete Methoden vorgestellt3.1 gleichIn der Objektklasse wird diese Methode zum Vergleichen von Größen verwendet. Die zugrunde liegende Implementierungslogik ist wie folgt :
class B implements Cloneable { int k; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class A implements Cloneable{ int i; int j; B c=new B(); @Override protected Object clone() throws CloneNotSupportedException { A tmp=(A)super.clone(); tmp.c=(B)this.c.clone(); return tmp; } @Override public String toString() { return "{" + "i=" + i + ", j=" + j + ", c.k=" + c.k + '}'; } }
Über "==": Wenn die Variablen auf beiden Seiten Basistypvariablen sind, wird verglichen, ob die Werte gleich sind, und wenn es sich um Referenztypvariablen handelt, wird verglichen, ob die Adressen gleich sind
3.2 toString
Ausgabeanweisung Der zugrunde liegende Aufruf von System.out.println() ist die toString-Methode. Wenn es sich bei der Ausgabe jedoch um Referenztypdaten handelt, wird standardmäßig die geänderte Adresse ausgegeben, sodass sie zu diesem Zeitpunkt neu geschrieben werden muss. Aus diesem Grund gibt es im obigen Beispiel eine toString-Methode
Das obige ist der detaillierte Inhalt vonSo definieren und verwenden Sie abstrakte Java-Klassen und -Schnittstellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!