overriding predefined methods java
Denne opplæringen forklarer hvordan du overstyrer forhåndsdefinerte metoder som lik (), hashCode (), sammenligne til (), etc. i Java med eksempler:
I vår forrige opplæring diskuterte vi polymorfisme med runtime i Java. Runtime polymorfisme i Java er implementert ved hjelp av metodeoverstyring. Metodeoverstyring innebærer å omdefinere overordnet klassemetode i underklassen.
Java har forskjellige forhåndsdefinerte metoder som lik (), hashCode (), CompareTo (), toString () osv. Som ofte brukes til generelle objekter uavhengig av hvilken klasse de tilhører. Men for at disse metodene skal fungere for alle objekter, må vi overstyre disse metodene eller omdefinere implementeringene deres slik at de kan jobbe med dataene vi ønsker.
=> Besøk her for å lære Java fra bunnen av.
I denne opplæringen vil vi diskutere overstyring av alle disse metodene sammen med konsekvensene hvis vi ikke overstyrer disse metodene.
Hva du vil lære:
- Overstyring er lik () og hashCode () -metoder i Java
- Overstyrende statisk metode i Java
- Overstyring CompareTo () i Java
- Overstyr toString () -metoden i Java
- ofte stilte spørsmål
- Konklusjon
- Anbefalt lesing
Overstyring er lik () og hashCode () -metoder i Java
Vi bruker metoden equals () i Java for å sammenligne to objekter. Denne metoden returnerer sant når objektene er like og falske når de ikke er like.
To måter brukes til å sammenligne likheten mellom to objekter.
# 1) Grunn sammenligning
Grunn sammenligning er standardimplementeringen for metoden equals () definert i klassen “java.lang.Object”. Som en del av denne implementeringen vil metoden equals () sjekke om to objekter som sammenlignes har referanser som refererer til det samme objektet.
Dette betyr at hvis obj1 og obj2 er to objekter, vil standardimplementeringen av metoden equals () (grunne sammenligning) bare sjekke om referansene til obj1 og obj2 er fra samme objekt.
salgssted programvare for ipad
I grunne sammenligninger sammenlignes ingen datainnhold.
# 2) Dyp sammenligning
I dyp sammenligning sammenligner vi dataelementene til hvert objekt, dvs. objektene sammenlignes med hensyn til tilstanden. Så vi sammenligner objektene på et dypt nivå inkludert innholdet.
For å sammenligne objektene ved hjelp av dyp sammenligning overstyrer vi vanligvis metoden equals ().
Vurder nå følgende 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 '); } } }
Produksjon:
Hvis vi ser utdataene fra programmet ovenfor, står det at objektene ikke er like, selv om innholdet i de to objektene er det samme. Dette skyldes at når likheten kontrolleres, blir det bestemt om de to objektene c1 og c2 refererer til det samme objektet.
Som det fremgår av programmet c1 og c2 er to forskjellige objekter, så de er forskjellige referanser og blir dermed resultert i det.
La oss nå lage en tredje referanse c3 og likestille den med c1 som følger:
Kompleks c3 = c1;
I dette tilfellet vil c3 og c1 referere til det samme objektet, og dermed vil (c3 == c1) returnere true.
Det ovennevnte programmet gjorde var den grunne sammenligningen. Så hvordan sjekker vi om to objekter er like innholdsmessige?
Her går vi for en dyp sammenligning, og for dette formålet overstyrer vi equals () -metoden.
Følgende program viser overstyringen av metoden equals (). Vi bruker den samme komplekse klassen.
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 '); } } }
Produksjon:
Nå som vi har en overstyrt lik () -metode, når vi sammenligner to objekter, viser utdataene at de to objektene er like siden innholdet er det samme. Legg merke til metoden overstyrte lik (). Her sjekker vi om begge objektene har samme referanse. Hvis ikke, sjekker vi innholdet av disse objektene individuelt.
I Java, er det tilrådelig å overstyre hashCode () -metoden når vi overstyrer lik () -metoden. Dette er fordi hvis vi ikke overstyrer hashCode () -metoden, kan hvert objekt ha forskjellig hashCode.
Dette kan ikke forstyrre de generelle objektene, men visse hasjbaserte samlinger som HashTable, HashSet og HashMap fungerer kanskje ikke som de skal.
Følgende program viser lik () og hashCode () metoder overstyrt.
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()); } } }
Produksjon:
hvordan åpne .7z filer på mac
I dette programmet bruker vi en hashMap. Vi har overstyrt begge lik () og hashCode () -metodene. Så når vi sier map.put (e1, 'C ++'), hashes det til noen bøtteplassering. Deretter kaller vi et map.put (e2, “Python”). Denne gangen vil den hasj til samme bøtte og erstatte den forrige verdien. Dette er fordi vi har overstyrt hashCode () -metoden.
Overstyrende statisk metode i Java
Kan vi overstyre den statiske metoden i Java?
Når det gjelder å overstyre den statiske metoden i Java, er det direkte svaret på dette spørsmålet Nei, vi kan ikke overstyre den statiske metoden.
Den statiske metoden påkalles ved hjelp av selve kursnavnet. Vi trenger ikke et objekt for å kalle en statisk metode. Så selv om vi erklærer en metode med samme prototype i en underklasse, kan vi ikke kalle den overordnet. I stedet skjuler vi bare foreldreklassedefinisjonen av den statiske metoden.
Følgende Java-program viser den statiske metoden og den ikke-statiske metoden i et arvesystem sammen med deres oppførsel ved kjøretid.
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(); } }
Produksjon:
Fra programutgangen kan vi konkludere med følgende.
- Kallingen til den statiske metoden gjøres alltid basert på referansetypen. Derfor da vi ringte new_obj. display () i ovennevnte program, da referansen new_obj er av typen class Parent, kalles display () -metoden for foreldreklassen.
- På den annen side kalles ikke-statiske metoder basert på innholdet i referanseobjektet som metoden kalles med. Derfor kaller metoden new_obj.print () i ovennevnte metode utskriftsmetoden () for underklassen, da innholdet av new_obj er gjenstand for underklassen.
Dette forklarer resultatet av programmet ovenfor, og vi må også huske følgende punkter når vi arbeider med statiske metoder i OOP-systemet.
- En statisk metode kan ikke skjule en ikke-statisk forekomstmetode, og en ikke-statisk forekomstmetode kan ikke overstyre en statisk metode.
- Vi kan overbelaste metodene fra foreldreklassen i en underklasse, men de overstyrer ikke eller skjuler foreldreklassemetodene, de er snarere nye metoder i underklassen.
Overstyring CompareTo () i Java
Vi vet at grensesnittet java.lang.Comparable gir en 'comparTo ()' -metode ved hjelp av hvilken vi kan sortere objektene i en naturlig rekkefølge som leksikalsk rekkefølge for strengobjekter, numerisk rekkefølge for heltall, etc.
For å implementere sortering i brukerdefinerte objekter eller samlinger, må vi overstyre metoden comparTo () for å sortere samleelementene eller brukerdefinerte objektene.
Så hva gjør en comparTo () -metode?
En comparTo () -metode må returnere positiv verdi hvis det nåværende objektet er større enn det passerte objektet i rekkefølge, og den negative verdien for det nåværende objektet er mindre enn det passerte objektet. Hvis begge objektene er like, vil sammenligningsmetoden () gi null.
Et annet poeng å merke seg er at metoden er lik () og comparTo () skal oppføre seg konsekvent med hverandre. Dette betyr at hvis comparTo () -metoden returnerer at to objekter er like (returnerer null), bør vi også ha samme utdata fra lik () -metoden.
La oss implementere et Java-program som overstyrer comparTo () -metoden. I dette programmet bruker vi en fargeklasse som har to private variabler, dvs. navn og id. Vi har assosiert 'id' med hver farge, og vi vil overstyre sammenligningsmetoden () for å ordne farger i henhold til 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() + ' , '); }
Produksjon:
I ovennevnte utgang viser vi først listen over farger og deretter den sorterte fargelisten. I programmet har vi overstyrt sammenligningsmetoder () og sammenligning ().
Overstyr toString () -metoden i Java
Metoden ‘toString ()’ returnerer strengrepresentasjonen av et objekt i Java. Men når vi har brukerdefinerte objekter, kan denne metoden oppføre seg annerledes.
For eksempel,vurdere følgende 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); } }
Produksjon:
Som vist i dette programmet viser vi det komplekse klasseobjektet som vi har definert tidligere. Resultatet som vises er imidlertid ikke innholdet, men det er ganske kryptisk.
Utgangen viser et klassenavn Complex etterfulgt av ‘@’ karakter og deretter hashCode for objektet. Dette er standardutskriften som skrives ut med toString () -metoden i Object-klassen.
Hvis vi vil ha riktig utgang, må vi overstyre toString () -metoden i applikasjonen vår.
Det følgende Java-programmet viser hvordan du overstyrer toString () -metoden for å skrive ut innholdet av det komplekse 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); } }
Produksjon:
Ovennevnte program viser at toString () -metoden blir overstyrt for å returnere innholdet av komplekst objekt i det gitte formatet (real + i * imaginær).
Generelt, når vi vil vise klasseobjektet ved hjelp av enten print () eller println (), er det alltid tilrådelig å overstyre metoden toString () slik at vi får riktig utgang.
ofte stilte spørsmål
Q # 1) Hvorfor bruke .equals i stedet for == Java?
hvordan initialisere statiske variabler i c ++
Svar: Vi bruker ‘==’ for å sammenligne primitive typer som int, char, boolean, etc. Vi bruker lik () for å sammenligne objekter (forhåndsdefinerte eller brukerdefinerte). Vi overstyrer vanligvis lik () -metoden for å sammenligne to objekter, og returverdien av lik () avhenger av den overstyrte koden.
Q # 2) Hva brukes hashCode () og lik () til?
Svar: I Java brukes metoden equals () for å sammenligne likheten til to objekter. Metoden hashCode () returnerer hashCode til objektet. Mens metoden equals () brukes med de fleste objekter for å teste likheten, brukes hashCode mest i hash-samlinger som HashTable, HashMap, HashSet, etc.
Sp # 3) Kan vi endre argumentlisten til den overstyrte metoden?
Svar: Nei. Når vi overstyrer metoden, holder vi metodesignaturen eller prototypen på metoden den samme i underklassen også. Så vi kan ikke endre antall parametere i den overstyrte metoden.
Q # 4) Hvorfor overstyrer vi toString ()?
Svar: Når toString () -metoden overstyres, kan vi returnere verdiene til objektet som toString () -metoden blir overstyrt uten å skrive for mye kode. Dette er fordi Java-kompilatoren påkaller toString () -metoden når vi skriver ut et objekt.
Sp # 5) Hva vil skje hvis du ikke overstyrer toString () -metoden?
Svar: Hvis vi ikke overstyrer toString () -metoden, får vi ingen informasjon om egenskapene eller tilstanden til objektet. Vi vet ikke hva som faktisk er inne i objektet. Så alle klassene bør overstyre metoden toString ().
Dette er fordi standardimplementeringen av toString () -metoden viser String-representasjonen, men når vi bruker standard toString () -implementering på objektet, får vi ikke innholdet i objektet.
Konklusjon
I denne opplæringen diskuterte vi overstyring av noen forhåndsdefinerte Java-metoder, og vi så også hvorfor vi trenger å overstyre dem.
Når vi håndterer objekter, kan det hende at standardimplementering av metoder som equals (), comparTo () og toString () ikke gir riktig informasjon. Derfor går vi for å overstyre.
=> Ta en titt på Java Beginners Guide her.
Anbefalt lesing
- Java String Tutorial | Java strengmetoder med eksempler
- Java-tråder med metoder og livssyklus
- Java strenglengde () Metode med eksempler
- Omvend en matrise i Java - 3 metoder med eksempler
- Hvordan bruke Java toString Method?
- Java-strengindeks Av metode med kodeeksempler
- Java String inneholder () Metodeopplæring med eksempler
- Java String Split () Metode - Hvordan dele en streng i Java