overriding predefined methods java
Denna handledning förklarar hur man åsidosätter fördefinierade metoder som lika (), hashCode (), jämför till (), etc. i Java med exempel:
I vår tidigare handledning diskuterade vi runtime polymorfism i Java. Runtime polymorfism i Java implementeras med metodöverstyrning. Metodöverstyrning innebär att omdefiniera överordnad klassmetod i underklassen.
Java har olika fördefinierade metoder som lika med (), hashCode (), jämförTo (), toString (), etc. som vanligtvis används för allmänna objekt oavsett vilken klass de tillhör. Men för att dessa metoder ska fungera för alla objekt måste vi åsidosätta dessa metoder eller omdefiniera deras implementeringar så att de kan arbeta med de data vi vill ha.
=> Besök här för att lära dig Java från grunden.
I denna handledning kommer vi att diskutera åsidosättandet av alla dessa metoder tillsammans med konsekvenserna om vi inte åsidosätter dessa metoder.
Vad du kommer att lära dig:
- Åsidosättande är lika med () och hashCode () -metoder i Java
- Åsidosättande av statisk metod i Java
- Åsidosättande jämförTo () i Java
- Åsidosätt tillString () -metoden i Java
- Vanliga frågor
- Slutsats
- Rekommenderad läsning
Åsidosättande är lika med () och hashCode () -metoder i Java
Vi använder metoden equals () i Java för att jämföra två objekt. Denna metod returnerar true när objekten är lika och falska när de inte är lika.
Två sätt används för att jämföra likheten mellan två objekt.
# 1) Grunn jämförelse
Grunn jämförelse är standardimplementeringen för metoden equals () definierad i klassen “java.lang.Object”. Som en del av denna implementering kommer metoden equals () att kontrollera om två objekt som jämförs har referenser som hänvisar till samma objekt.
Detta innebär att om obj1 och obj2 är två objekt, kommer standardimplementeringen av metoden equals () (grunt jämförelse) endast att kontrollera om referenserna till obj1 och obj2 kommer från samma objekt.
I grund jämförelse jämförs inget datainnehåll.
# 2) Djupjämförelse
I djupjämförelse jämför vi datamedlemmarna för varje objekt, dvs. objekten jämförs med avseende på tillståndet. Så vi jämför objekten på en djup nivå inklusive dess innehåll.
vad är en bra e-posttjänst
För att jämföra objekten med djupjämförelse åsidosätter vi vanligtvis metoden equals ().
Tänk nu på följande Java-program.
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 '); } } }
Produktion:
Om vi ser utdata från ovanstående program står det att objekten inte är lika trots att innehållet i de två objekten är desamma. Detta beror på att när jämställdheten kontrolleras bestäms det om de två objekten c1 och c2 hänvisar till samma objekt.
Som framgår av programmet c1 och c2 är två olika objekt, så de är olika referenser och därmed resulterar det.
Låt oss nu skapa en tredje referens c3 och jämföra den med c1 enligt följande:
Komplex c3 = c1;
I det här fallet kommer c3 och c1 att referera till samma objekt, och därmed kommer (c3 == c1) att vara sant.
Vad ovanstående program gjorde var den grunda jämförelsen. Så hur kontrollerar vi om två objekt är samma innehållsmässigt?
Här går vi för en djup jämförelse, och för detta ändamål åsidosätter vi metoden equals ().
Följande program visar åsidosättningen av metoden lika (). Vi använder samma komplexa klass.
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 '); } } }
Produktion:
Nu när vi har en åsidosatt lik () -metod, när vi jämför två objekt, visar utdata att de två objekten är lika eftersom deras innehåll är detsamma. Notera metoden åsidosatta lika (). Här kontrollerar vi om båda objekten har samma referens. Om inte kontrollerar vi individuellt innehållet i dessa objekt.
I Java är det lämpligt att åsidosätta metoden hashCode () när vi åsidosätter metoden equals (). Detta beror på att om vi inte åsidosätter metoden hashCode (), kan varje objekt ha olika hashCode.
Det här kanske inte stör de allmänna objekten, men vissa hashbaserade samlingar som HashTable, HashSet och HashMap kanske inte fungerar korrekt.
Följande program visar lika () och hashCode () -metoder åsidosatta.
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()); } } }
Produktion:
I det här programmet använder vi en hashMap. Vi har åsidosatt både lika () och hashCode () -metoder. Så när vi säger map.put (e1, “C ++”), hashes det till någon hink plats. Därefter kallar vi en map.put (e2, “Python”). Den här gången kommer den att ha samma hink och ersätta det tidigare värdet. Detta beror på att vi har åsidosatt metoden hashCode ().
Åsidosättande av statisk metod i Java
Kan vi åsidosätta den statiska metoden i Java?
När det gäller åsidosättande av den statiska metoden i Java är det direkta svaret på denna fråga Nej, vi kan inte åsidosätta den statiska metoden.
Den statiska metoden åberopas med hjälp av själva klassnamnet. Vi behöver inte ett objekt för att anropa en statisk metod. Så även om vi förklarar en metod med samma prototyp i en underklass, kan vi inte kalla det övervägande. Istället gömmer vi bara definitionen av föräldraklassen för den statiska metoden.
Följande Java-program visar den statiska metoden och den icke-statiska metoden i ett arvssystem tillsammans med deras beteende vid körning.
hur man spelar en bin-fil
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(); } }
Produktion:
Från programutgången kan vi dra följande slutsatser.
- Anropet till den statiska metoden görs alltid baserat på typen av referens. Därför när vi ringde new_obj. display () i ovanstående program, eftersom referensen new_obj är av typklass Parent, kallas display () -metoden för Parent class.
- Å andra sidan kallas icke-statiska metoder baserat på innehållet i referensobjektet som metoden kallas för. Följaktligen i metoden ovan kallar new_obj.print () metoden print () -metoden för underklassen, eftersom innehållet new_obj är objektet för underklassen.
Detta förklarar resultatet av programmet ovan och vi måste också komma ihåg följande punkter när vi hanterar statiska metoder i OOP-systemet.
- En statisk metod kan inte dölja en icke-statisk förekomstmetod och en icke-statisk förekomstmetod kan inte åsidosätta en statisk metod.
- Vi kan överbelasta metoderna från föräldraklassen i en underklass men de varken åsidosätter eller döljer föräldraklassmetoderna, utan de är nya metoder i underklassen.
Åsidosättande jämförTo () i Java
Vi vet att gränssnittet java.
För att implementera sortering i användardefinierade objekt eller samlingar, måste vi åsidosätta metoden comparTo () för att sortera samlingselementen eller användardefinierade objekt.
Så vad gör en jämförelse () metod?
En jämförelsemetod () måste returnera positivt värde om det aktuella objektet är större än det skickade objektet i ordning och det negativa värdet för det aktuella objektet är mindre än det skickade objektet. Om båda objekten är lika, returnerar metoden comparTo () noll.
En annan punkt att notera är att metoden är lika med () och jämförTo () ska bete sig konsekvent med varandra. Detta innebär att om jämförelsenTo () -metoden returnerar att två objekt är lika (returnerar noll) ska vi också ha samma utdata från metoden lika ().
Låt oss implementera ett Java-program som åsidosätter jämförelsemetoden (). I det här programmet använder vi en färgklass som har två privata variabler, dvs namn och id. Vi har associerat 'id' med varje färg och vi kommer att åsidosätta jämförelsemetoden () för att ordna färger enligt id.
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() + ' , '); }
Produktion:
I ovanstående utdata visar vi först färglistan och sedan den sorterade färglistan. I programmet har vi åsidosatt jämförelserna CompareTo () och jämför ().
Åsidosätt tillString () -metoden i Java
Metoden 'toString ()' returnerar strängrepresentationen för ett objekt i Java. Men när vi har användardefinierade objekt kan den här metoden uppträda annorlunda.
Till exempel,överväga följande program.
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); } }
Produktion:
Som visas i detta program visar vi det komplexa klassobjektet som vi har definierat tidigare. Den visade produktionen är dock inte innehållet utan är ganska kryptisk.
Utgången visar ett klassnamn Complex följt av '@' karaktär och sedan hashCode för objektet. Detta är standardutmatningen som skrivs ut med toString () -metoden i Object-klassen.
Om vi vill ha rätt utdata måste vi åsidosätta metoden toString () i vår applikation.
Följande Java-program visar hur man åsidosätter toString () -metoden för att skriva ut innehållet i det komplexa objektet.
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); } }
Produktion:
Ovanstående program visar att metoden toString () åsidosätts för att returnera innehållet i det komplexa objektet i det angivna formatet (real + i * imaginär).
I allmänhet, när vi vill visa klassobjektet med antingen print () eller println (), är det alltid tillrådligt att åsidosätta toString () -metoden så att vi får rätt utdata.
Vanliga frågor
F # 1) Varför använda .equals istället för == Java?
bästa skärmbildsprogrammet Windows 10
Svar: Vi använder ‘==’ för att jämföra primitiva typer som int, char, boolean, etc. Vi använder lika () för att jämföra objekt (fördefinierade eller användardefinierade). Vi åsidosätter vanligtvis metoden lika () för att jämföra två objekt och returvärdet för lika () beror på den åsidosatta koden.
F # 2) Vad används hashCode () och lika med () för?
Svar: I Java används metoden equals () för att jämföra likheten mellan två objekt. Metoden hashCode () returnerar objektets hashCode. Även om metoden equals () används med de flesta föremål för att testa deras likhet, används hashCode mestadels i hash-samlingar som HashTable, HashMap, HashSet, etc.
F # 3) Kan vi ändra argumentlistan för den åsidosatta metoden?
Svar: Nej. När vi åsidosätter metoden håller vi metodens signatur eller prototyp för metoden densamma också i underklassen. Så vi kan inte ändra antalet parametrar i den åsidosatta metoden.
F # 4) Varför åsidosätter vi toString ()?
Svar: När metoden toString () åsidosätts kan vi returnera värdena för det objekt som metoden toString () åsidosätter utan att skriva för mycket kod. Detta beror på att Java-kompilatorn åberopar metoden toString () när vi skriver ut ett objekt.
F # 5) Vad skulle hända om du inte åsidosätter metoden toString ()?
Svar: Om vi inte åsidosätter toString () -metoden får vi ingen information om objektets egenskaper eller tillstånd. Vi vet inte vad som faktiskt finns i objektet. Så alla klasser bör åsidosätta metoden toString ().
Detta beror på att standardimplementeringen av toString () -metoden visar strängrepresentationen, men när vi använder standard toString () -implementeringen på objektet får vi inte innehållet i objektet.
Slutsats
I denna handledning diskuterade vi hur man åsidosätter några fördefinierade Java-metoder och vi såg också varför vi behöver åsidosätta dem.
När vi hanterar objekt kanske standardimplementeringarna av metoder som equals (), comparTo () och toString () inte ger rätt information. Därför går vi för att åsidosätta.
=> Ta en titt på Java-nybörjarguiden här.
Rekommenderad läsning
- Java String Tutorial | Java-strängmetoder med exempel
- Java-trådar med metoder och livscykel
- Java Stränglängd () Metod med exempel
- Omvänd en matris i Java - 3 metoder med exempel
- Hur man använder Java toString Method?
- Java String indexOf Method With Code Exempel
- Java String innehåller () Metodhandledning med exempel
- Java String Split () Metod - Hur man delar upp en sträng i Java