overriding predefined methods java
In diesem Tutorial wird anhand von Beispielen erläutert, wie vordefinierte Methoden wie equals (), hashCode (), compareTo () usw. in Java überschrieben werden:
In unserem vorherigen Tutorial haben wir den Laufzeitpolymorphismus in Java erörtert. Der Laufzeitpolymorphismus in Java wird mithilfe der Methodenüberschreibung implementiert. Beim Überschreiben von Methoden wird die übergeordnete Klassenmethode in der Unterklasse neu definiert.
Java verfügt über verschiedene vordefinierte Methoden wie equals (), hashCode (), compareTo (), toString () usw., die häufig für allgemeine Objekte verwendet werden, unabhängig davon, zu welcher Klasse sie gehören. Damit diese Methoden für alle Objekte funktionieren, müssen wir diese Methoden überschreiben oder ihre Implementierungen neu definieren, damit sie mit den gewünschten Daten arbeiten können.
=> Besuchen Sie hier, um Java von Grund auf neu zu lernen.
In diesem Tutorial werden wir das Überschreiben all dieser Methoden zusammen mit den Konsequenzen diskutieren, wenn wir diese Methoden nicht überschreiben.
Was du lernen wirst:
- Überschreiben der Methoden equals () und hashCode () in Java
- Überschreiben der statischen Methode in Java
- Überschreiben von compareTo () in Java
- ToString () -Methode in Java überschreiben
- Häufig gestellte Fragen
- Fazit
- Literatur-Empfehlungen
Überschreiben der Methoden equals () und hashCode () in Java
Wir verwenden die Methode equals () in Java, um zwei Objekte zu vergleichen. Diese Methode gibt true zurück, wenn die Objekte gleich sind, und false, wenn sie nicht gleich sind.
Es gibt zwei Möglichkeiten, um die Gleichheit zweier Objekte zu vergleichen.
# 1) Flacher Vergleich
Ein flacher Vergleich ist die Standardimplementierung für die in der Klasse 'java.lang.Object' definierte Methode equals (). Im Rahmen dieser Implementierung prüft die equals () -Methode, ob zwei verglichene Objekte Verweise auf dasselbe Objekt haben.
Dies bedeutet, dass wenn obj1 und obj2 zwei Objekte sind, die Standardimplementierung der equals () -Methode (flacher Vergleich) nur prüft, ob die Referenzen von obj1 und obj2 vom selben Objekt stammen.
Im flachen Vergleich werden keine Dateninhalte verglichen.
# 2) Tiefer Vergleich
Im tiefen Vergleich vergleichen wir die Datenelemente jedes Objekts, d. H. Die Objekte werden in Bezug auf den Zustand verglichen. Wir vergleichen also die Objekte auf einer tiefen Ebene einschließlich ihres Inhalts.
Um die Objekte mit einem tiefen Vergleich zu vergleichen, überschreiben wir normalerweise die Methode equals ().
Betrachten Sie nun das folgende Java-Programm.
wie man einen einfachen binären Suchbaum in Java implementiert
class Complex { private double r, i; //declare real and imaginary component as private public Complex(double r, double i) { //constructor this.r = r; this.i = i; } } public class Main { public static void main(String() args) { Complex c1 = new Complex(5, 10); //c1 object Complex c2 = new Complex(5, 10); //c2 object if (c1 == c2) { System.out.println('Two Complex objects are Equal '); } else { System.out.println('Two Complex objects are not Equal '); } } }
Ausgabe:
Wenn wir die Ausgabe des obigen Programms sehen, heißt es, dass die Objekte nicht gleich sind, obwohl der Inhalt der beiden Objekte gleich ist. Dies liegt daran, dass bei der Überprüfung der Gleichheit festgestellt wird, ob sich die beiden Objekte c1 und c2 auf dasselbe Objekt beziehen.
Wie im Programm c1 und c2 zu sehen sind, handelt es sich um zwei verschiedene Objekte, also um unterschiedliche Referenzen und daraus ergibt sich dies.
Erstellen wir nun eine dritte Referenz c3 und setzen sie wie folgt mit c1 gleich:
Komplex c3 = c1;
In diesem Fall beziehen sich c3 und c1 auf dasselbe Objekt, und daher gibt (c3 == c1) true zurück.
Was das obige Programm tat, war der flache Vergleich. Wie prüfen wir also, ob zwei Objekte inhaltlich gleich sind?
Hier machen wir einen tiefen Vergleich und überschreiben zu diesem Zweck die Methode equals ().
Das folgende Programm zeigt das Überschreiben der equals () -Methode. Wir verwenden dieselbe komplexe Klasse.
class Complex { private double r, i; public Complex(double r, double i) { this.r = r; this.i = i; } // override equals () method to compare two complex objects @Override public boolean equals(Object obj) { // returns true=>object is compared to itself if (obj == this) { return true; } //return false if obj is not an instance of Complex class if (!(obj instanceof Complex)) { return false; } // typecast obj to Complex type Complex c = (Complex) obj; // Compare the contents of two objects and return value return Double.compare(r, c.r) == 0 && Double.compare(i, c.i) == 0; } } public class Main { public static void main(String() args) { Complex c1 = new Complex(5, 10); Complex c2 = new Complex(5, 10); if (c1.equals(c2)) { System.out.println('Complex objects c1 and c2 are Equal '); } else { System.out.println('Complex objects c1 and c2 are not Equal '); } } }
Ausgabe:
Nachdem wir nun eine überschriebene equals () -Methode haben, zeigt die Ausgabe beim Vergleich zweier Objekte, dass die beiden Objekte gleich sind, da ihr Inhalt gleich ist. Beachten Sie die überschriebene equals () -Methode. Hier prüfen wir, ob beide Objekte dieselbe Referenz haben. Wenn nicht, prüfen wir den Inhalt dieser Objekte individuell.
Wenn wir in Java die Methode equals () überschreiben, ist es ratsam, auch die Methode hashCode () zu überschreiben. Dies liegt daran, dass jedes Objekt möglicherweise einen anderen HashCode hat, wenn wir die hashCode () -Methode nicht überschreiben.
Dies beeinträchtigt möglicherweise nicht die allgemeinen Objekte, aber bestimmte Hash-basierte Sammlungen wie HashTable, HashSet und HashMap funktionieren möglicherweise nicht ordnungsgemäß.
Das folgende Programm zeigt die überschriebenen Methoden equals () und hashCode ().
import java.io.*; import java.util.*; class EqualsHashCode { String name; int id; EqualsHashCode(String name, int id) { this.name = name; this.id = id; } @Override public boolean equals(Object obj) @Override public int hashCode() { // return current object's id as hashCode return this.id; } } class Main { public static void main (String() args) { // create two objects with same state EqualsHashCode e1 = new EqualsHashCode('Java', 1); EqualsHashCode e2 = new EqualsHashCode('Java', 1); //update the objects Map map = new HashMap(); map.put(e1, 'C++'); map.put(e2, 'Python'); //display contents for(EqualsHashCode eh : map.keySet()) { System.out.println(map.get(eh).toString()); } } }
Ausgabe:
In diesem Programm verwenden wir eine HashMap. Wir haben die Methoden equals () und hashCode () überschrieben. Wenn wir also map.put (e1, 'C ++') sagen, wird es an eine Bucket-Position gehasht. Als nächstes rufen wir eine map.put (e2, 'Python') auf. Dieses Mal wird es in denselben Bucket gehasht und den vorherigen Wert ersetzt. Dies liegt daran, dass wir die Methode hashCode () überschrieben haben.
Überschreiben der statischen Methode in Java
Können wir die statische Methode in Java überschreiben?
Was das Überschreiben der statischen Methode in Java betrifft, lautet die direkte Antwort auf diese Frage Nein. Wir können die statische Methode nicht überschreiben.
Die statische Methode wird unter Verwendung des Klassennamens selbst aufgerufen. Wir brauchen kein Objekt, um eine statische Methode aufzurufen. Selbst wenn wir eine Methode mit demselben Prototyp in einer Unterklasse deklarieren, können wir sie nicht als überschreibend bezeichnen. Stattdessen verstecken wir nur die übergeordnete Klassendefinition der statischen Methode.
Das folgende Java-Programm zeigt die statische und die nicht statische Methode in einem Vererbungssystem zusammen mit ihrem Verhalten zur Laufzeit.
class Parent { // Parent class static method cannot be overridden by Child public static void display() { System.out.println('Parent class::static display()'); } // parent class non-static print method to be overridden by Child public void print() { System.out.println('Parent class::non-static print()'); } } // Subclass class Child extends Parent { // static display() method =>hides display() in Parent class public static void display() { System.out.println('Child class:: static display()'); } //overrides print() in Parent class public void print() { System.out.println('Child class::Non-static print()'); } } public class Main { public static void main(String args( )) { Parent new_obj = new Child(); // static methods are call as per the reference type. Since reference type //Parent, this call will execute Parent class's display method new_obj.display(); // here the print () method of Child class is called new_obj.print(); } }
Ausgabe:
Aus der Programmausgabe können wir folgendes schließen.
- Der Aufruf der statischen Methode erfolgt immer basierend auf der Art der Referenz. Daher, als wir new_obj aufgerufen haben. display () Im obigen Programm wird die display () -Methode der Parent-Klasse aufgerufen, da die Referenz new_obj vom Typ class Parent ist.
- Andererseits werden nicht statische Methoden basierend auf dem Inhalt des Referenzobjekts aufgerufen, mit dem die Methode aufgerufen wird. Daher ruft die Methode new_obj.print () im obigen Programm die Methode print () der untergeordneten Klasse auf, da der Inhalt von new_obj das Objekt der untergeordneten Klasse ist.
Dies erklärt die Ausgabe des obigen Programms und wir müssen uns auch die folgenden Punkte merken, wenn wir uns mit statischen Methoden im OOP-System befassen.
- Eine statische Methode kann eine nicht statische Instanzmethode nicht ausblenden, und eine nicht statische Instanzmethode kann eine statische Methode nicht überschreiben.
- Wir können die Methoden aus der übergeordneten Klasse in einer Unterklasse überladen, aber sie überschreiben oder verbergen die Methoden der übergeordneten Klasse nicht, sondern sind neue Methoden in der Unterklasse.
Überschreiben von compareTo () in Java
Wir wissen, dass die Schnittstelle java.lang.Comparable eine 'compareTo ()' - Methode bereitstellt, mit der wir die Objekte in einer natürlichen Reihenfolge wie der lexikalischen Reihenfolge für String-Objekte, der numerischen Reihenfolge für Ganzzahlen usw. sortieren können.
Um die Sortierung in benutzerdefinierten Objekten oder Sammlungen zu implementieren, müssen Sie die compareTo () -Methode überschreiben, um die Sammlungselemente oder benutzerdefinierten Objekte zu sortieren.
Was macht eine compareTo () -Methode?
Eine compareTo () -Methode muss einen positiven Wert zurückgeben, wenn das aktuelle Objekt in der angegebenen Reihenfolge größer als das übergebene Objekt ist und der negative Wert des aktuellen Objekts kleiner als das übergebene Objekt ist. Wenn beide Objekte gleich sind, gibt die compareTo () -Methode Null zurück.
Ein weiterer zu beachtender Punkt ist, dass sich die Methoden equals () und compareTo () konsistent verhalten sollten. Dies bedeutet, dass wenn die compareTo () -Methode zurückgibt, dass zwei Objekte gleich sind (Null zurückgibt), wir auch die gleiche Ausgabe von der equals () -Methode haben sollten.
Implementieren wir ein Java-Programm, das die compareTo () -Methode überschreibt. In diesem Programm verwenden wir eine Farbklasse mit zwei privaten Variablen, d. H. Name und ID. Wir haben jeder Farbe die ID zugeordnet und überschreiben die compare () -Methode, um die Farben entsprechend der ID anzuordnen.
import java.util.*; //color class class Color implements Comparator, Comparable { private String name; private int id; Color() { } Color(String n, int id) { this.name = n; this.id = id; } public String getColorName() { return this.name; } public int getColorId() { return this.id; } // Overriding the compareTo method @Override public int compareTo(Color c) { return (this.name).compareTo(c.name); } // Overriding the compare method to sort the colors on id @Override public int compare(Color c, Color c1) { return c.id - c1.id; } } public class Main { public static void main(String args()) { // List of Colors List list = new ArrayList(); list.add(new Color('Red', 3)); list.add(new Color('Green', 2)); list.add(new Color('Blue', 5)); list.add(new Color('Orange', 4)); list.add(new Color('Yellow', 1)); Collections.sort(list); // Sorts the array list System.out.println('The list of colors:'); for(Color c: list) // print the sorted list of colors System.out.print(c.getColorName() + ', '); // Sort the array list using comparator Collections.sort(list, new Color()); System.out.println(' '); System.out.println('The sorted list of colors:'); for(Color c: list) // print the sorted list of colors as per id System.out.print(c.getColorId() + ':' + c.getColorName() + ' , '); }
Ausgabe:
In der obigen Ausgabe zeigen wir zuerst die Liste der Farben und dann die sortierte Liste der Farben an. Im Programm haben wir die Methoden compareTo () und compare () überschrieben.
ToString () -Methode in Java überschreiben
Die Methode 'toString ()' gibt die String-Darstellung eines Objekts in Java zurück. Wenn wir jedoch benutzerdefinierte Objekte haben, verhält sich diese Methode möglicherweise anders.
Zum Beispiel,Betrachten Sie das folgende Programm.
class Complex { private double r, i; public Complex(double r, double i) { this.r = r; this.i = i; } } public class Main { public static void main(String() args) { Complex c1 = new Complex(5, 20); //create complex class Object //print the contents of complex number System.out.println('Complex number contents: ' + c1); } }
Ausgabe:
Wie in diesem Programm gezeigt, zeigen wir das zuvor definierte Complex-Klassenobjekt an. Die angezeigte Ausgabe ist jedoch nicht der Inhalt, sondern eher kryptisch.
Die Ausgabe zeigt einen Klassennamen Complex, gefolgt von einem @ -Zeichen und dem Hashcode des Objekts. Dies ist die Standardausgabe, die von der toString () -Methode der Object-Klasse gedruckt wird.
Wenn wir die richtige Ausgabe wünschen, müssen wir die toString () -Methode in unserer Anwendung überschreiben.
Das folgende Java-Programm zeigt, wie Sie die toString () -Methode überschreiben, um den Inhalt des Complex-Objekts zu drucken.
class Complex { private double r, i; public Complex(double r, double i) { this.r = r; this.i = i; } //override toString () method to return String representation of complex number @Override public String toString() { return String.format(r + ' + i ' + i); } } public class Main { public static void main(String() args) { Complex c1 = new Complex(10, 15); System.out.println('Complex Number contents: ' + c1); } }
Ausgabe:
Das obige Programm zeigt, dass die toString () -Methode überschrieben wird, um den Inhalt des Complex-Objekts im angegebenen Format (real + i * imaginär) zurückzugeben.
Wenn wir das Klassenobjekt entweder mit print () oder println () anzeigen möchten, ist es im Allgemeinen immer ratsam, die toString () -Methode zu überschreiben, damit wir die richtige Ausgabe erhalten.
Häufig gestellte Fragen
F # 1) Warum .equals anstelle von == Java verwenden?
Antworten: Wir verwenden '==', um primitive Typen wie int, char, boolean usw. zu vergleichen. Wir verwenden equals (), um Objekte (vordefiniert oder benutzerdefiniert) zu vergleichen. Normalerweise überschreiben wir die Methode equals (), um zwei Objekte zu vergleichen, und der Rückgabewert von equals () hängt vom überschriebenen Code ab.
F # 2) Wofür wird hashCode () und equals () verwendet?
Antworten: In Java wird die equals () -Methode verwendet, um die Gleichheit zweier Objekte zu vergleichen. Die hashCode () -Methode gibt den hashCode des Objekts zurück. Während die equals () -Methode bei den meisten Objekten verwendet wird, um ihre Gleichheit zu testen, wird der hashCode hauptsächlich in Hash-Sammlungen wie HashTable, HashMap, HashSet usw. verwendet.
F # 3) Können wir die Argumentliste der überschriebenen Methode ändern?
Antworten: Nein. Wenn wir die Methode überschreiben, behalten wir die Methodensignatur oder den Prototyp der Methode auch in der Unterklasse bei. Daher können wir die Anzahl der Parameter in der überschriebenen Methode nicht ändern.
F # 4) Warum überschreiben wir toString ()?
Antworten: Wenn die toString () -Methode überschrieben wird, können wir die Werte des Objekts zurückgeben, für das die toString () -Methode überschrieben wird, ohne zu viel Code zu schreiben. Dies liegt daran, dass der Java-Compiler beim Drucken eines Objekts die Methode toString () aufruft.
F # 5) Was würde passieren, wenn Sie die toString () -Methode nicht überschreiben würden?
Antworten: Wenn wir die toString () -Methode nicht überschreiben, erhalten wir keine Informationen über die Eigenschaften oder den Status des Objekts. Wir werden nicht wissen, was sich tatsächlich im Objekt befindet. Daher sollten alle Klassen die toString () -Methode überschreiben.
Dies liegt daran, dass die Standardimplementierung der toString () -Methode die Zeichenfolgendarstellung anzeigt. Wenn wir jedoch die Standardimplementierung von toString () für das Objekt verwenden, wird der Inhalt des Objekts nicht abgerufen.
Fazit
In diesem Tutorial haben wir uns mit dem Überschreiben einiger vordefinierter Java-Methoden befasst und auch gesehen, warum wir sie überschreiben müssen.
Wenn wir uns mit Objekten befassen, liefern die Standardimplementierungen von Methoden wie equals (), compareTo () und toString () möglicherweise nicht die richtigen Informationen. Daher gehen wir zum Überschreiben.
=> Schauen Sie sich hier den Java Beginners Guide an.
Literatur-Empfehlungen
- Java String Tutorial | Java-String-Methoden mit Beispielen
- Java-Threads mit Methoden und Lebenszyklus
- Java String length () -Methode mit Beispielen
- Ein Array in Java umkehren - 3 Methoden mit Beispielen
- Wie verwende ich die Java toString-Methode?
- Java String indexOf Methode mit Codebeispielen
- Java String enthält () Method Tutorial mit Beispielen
- Java String Split () -Methode - So teilen Sie einen String in Java