overriding predefined methods java
Denne vejledning forklarer, hvordan man tilsidesætter foruddefinerede metoder som lig med (), hashCode (), sammenlign til () osv. I Java med eksempler:
regulære udtryk i c ++
I vores tidligere tutorial diskuterede vi runtime polymorfisme i Java. Runtime polymorfisme i Java implementeres ved hjælp af metode tilsidesættelse. Metodeoverstyring indebærer omdefineret overordnet klassemetode i underklassen.
Java har forskellige foruddefinerede metoder som lig med (), hashCode (), CompareTo (), toString () osv., Der ofte bruges til generelle objekter, uanset hvilken klasse de tilhører. Men for at disse metoder skal fungere for alle objekter, er vi nødt til at tilsidesætte disse metoder eller omdefinere deres implementeringer, så de kan arbejde med de data, vi ønsker.
=> Besøg her for at lære Java fra bunden.
I denne vejledning diskuterer vi tilsidesættelsen af alle disse metoder sammen med konsekvenserne, hvis vi ikke tilsidesætter disse metoder.
Hvad du lærer:
- Tilsidesættelse er lig med () og hashCode () -metoder i Java
- Tilsidesættelse af statisk metode i Java
- Tilsidesættelse sammenlignTo () i Java
- Tilsidesæt toString () -metode i Java
- Ofte stillede spørgsmål
- Konklusion
- Anbefalet læsning
Tilsidesættelse er lig med () og hashCode () -metoder i Java
Vi bruger metoden lig () i Java til at sammenligne to objekter. Denne metode returnerer sandt, når objekterne er ens og falske, når de ikke er ens.
To måder bruges til at sammenligne lighed mellem to objekter.
# 1) Lav sammenligning
Lav sammenligning er standardimplementeringen for ligemetoden () defineret i klassen “java.lang.Object”. Som en del af denne implementering vil metoden lig () kontrollere, om to objekter, der sammenlignes, har referencer, der henviser til det samme objekt.
Dette betyder, at hvis obj1 og obj2 er to objekter, vil standardimplementeringen af metoden lig () (lav sammenligning) kun kontrollere, om referencerne til obj1 og obj2 er fra det samme objekt.
I lav sammenligning sammenlignes intet dataindhold.
# 2) Dyb sammenligning
I dyb sammenligning sammenligner vi dataelementerne for hvert objekt, dvs. objekterne sammenlignes med hensyn til tilstanden. Så vi sammenligner objekterne på et dybt niveau inklusive dets indhold.
For at sammenligne objekterne ved hjælp af dyb sammenligning tilsidesætter vi normalt metoden lig ().
Overvej nu 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 '); } } }
Produktion:
Hvis vi ser output fra ovenstående program, siger det, at objekterne ikke er ens, selvom indholdet af de to objekter er det samme. Dette skyldes, at når ligestillingen kontrolleres, bestemmes det, om de to objekter c1 og c2 henviser til det samme objekt.
Som det ses i programmet er c1 og c2 to forskellige objekter, så de er forskellige referencer og resulteres derved således.
Lad os nu oprette en tredje reference c3 og sidestille den med c1 som følger:
Kompleks c3 = c1;
I dette tilfælde henviser c3 og c1 til det samme objekt, og derfor (c3 == c1) vil returnere true.
Hvad ovenstående program gjorde var den lave sammenligning. Så hvordan kontrollerer vi, om to objekter er ens indholdsmæssigt?
Her går vi til en dyb sammenligning, og til dette formål tilsidesætter vi ligemetoden ().
Det følgende program viser tilsidesættelsen af ligemetoden (). Vi bruger den samme komplekse 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 '); } } }
Produktion:
Nu hvor vi har en tilsidesat ligemetode (), når vi sammenligner to objekter, viser output, at de to objekter er ens, da deres indhold er det samme. Bemærk den tilsidesatte ligemetode (). Her kontrollerer vi, om begge objekter har samme reference. Hvis ikke, kontrollerer vi indholdet af disse objekter individuelt.
I Java anbefales det, når vi tilsidesætter metoden lig (), også at tilsidesætte hashCode () -metoden. Dette skyldes, at hvis vi ikke tilsidesætter hashCode () -metoden, så kan hvert objekt have forskellige hashCode.
Dette interfererer muligvis ikke med de generelle objekter, men visse hash-baserede samlinger som HashTable, HashSet og HashMap fungerer muligvis ikke korrekt.
Det følgende program viser lig med () og hashCode () -metoder tilsidesat.
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 dette program bruger vi en hashMap. Vi har tilsidesat begge lig () og hashCode () metoder. Så når vi siger map.put (e1, 'C ++'), hashes det til en eller anden skovplacering. Dernæst kalder vi et map.put (e2, “Python”). Denne gang vil den hash til den samme skovl og erstatte den tidligere værdi. Dette skyldes, at vi har tilsidesat metoden hashCode ().
Tilsidesættelse af statisk metode i Java
Kan vi tilsidesætte den statiske metode i Java?
hvad er den bedste downloader til musik til android
For så vidt angår tilsidesættelse af den statiske metode i Java, er det direkte svar på dette spørgsmål Nej, vi kan ikke tilsidesætte den statiske metode.
Den statiske metode påberåbes ved hjælp af selve klassens navn. Vi har ikke brug for et objekt for at kalde en statisk metode. Så selvom vi erklærer en metode med den samme prototype i en underklasse, kan vi ikke kalde den overordnet. I stedet skjuler vi bare definitionen af overordnet klasse på den statiske metode.
Det følgende Java-program viser den statiske metode og den ikke-statiske metode i et arvssystem sammen med deres opførsel ved kørsel.
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:
Fra programoutputtet kan vi konkludere følgende.
- Opkaldet til den statiske metode foretages altid baseret på referencetypen. Derfor da vi kaldte new_obj. display () i ovenstående program, da referencen new_obj er af typen klasse Parent, kaldes display () -metoden i overordnet klasse.
- På den anden side kaldes ikke-statiske metoder baseret på indholdet af referenceobjektet, som metoden kaldes til. Derfor kalder metoden new_obj.print () i ovenstående metode metoden print () for underklassen, da indholdet af nyt_obj er genstand for underklassen.
Dette forklarer output fra programmet ovenfor, og vi skal også huske følgende punkter, når vi beskæftiger os med statiske metoder i OOP-systemet.
- En statisk metode kan ikke skjule en ikke-statisk instansmetode, og en ikke-statisk instansmetode kan ikke tilsidesætte en statisk metode.
- Vi kan overbelaste metoderne fra overordnet klasse i en underklasse, men de tilsidesætter eller skjuler ikke overordnede klassemetoder, snarere er de nye metoder i underklassen.
Tilsidesættelse sammenlignTo () i Java
Vi ved, at grænsefladen java.lang.Comparable giver en 'CompareTo ()' -metode, hvor vi kan sortere objekterne i en naturlig rækkefølge som leksikalsk rækkefølge for strengobjekter, numerisk rækkefølge for heltal osv.
For at implementere sortering i brugerdefinerede objekter eller samlinger skal vi tilsidesætte metoden comparTo () for at sortere samlingselementerne eller brugerdefinerede objekter.
Så hvad gør en comparTo () -metode?
En sammenligningsmetode () skal returnere en positiv værdi, hvis det aktuelle objekt er større end det sendte objekt i rækkefølge, og den negative værdi for det aktuelle objekt er mindre end det sendte objekt. Hvis begge objekter er ens, returnerer metoden comparTo () nul.
Et andet punkt at bemærke er, at metoden er lig med () og sammenlignTo () skal opføre sig konsekvent med hinanden. Dette betyder, at hvis metoden comparTo () returnerer, at to objekter er ens (returnerer nul), skal vi også have den samme output fra ligemetoden ().
Lad os implementere et Java-program, der tilsidesætter metoden comparTo (). I dette program bruger vi en farveklasse, der har to private variabler, dvs. navn og id. Vi har tilknyttet 'id' med hver farve, og vi tilsidesætter sammenligningsmetoden () for at arrangere farver efter id'et.
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 ovenstående output viser vi først listen over farver og derefter den sorterede liste over farver. I programmet har vi tilsidesat sammenligningsmetoder () og sammenligning ().
Tilsidesæt toString () -metode i Java
Metoden 'toString ()' returnerer strengrepræsentationen af et objekt i Java. Men når vi har brugerdefinerede objekter, kan denne metode muligvis opføre sig anderledes.
For eksempel,overvej 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); } }
Produktion:
Som vist i dette program viser vi det komplekse klasseobjekt, som vi har defineret tidligere. Den viste output er dog ikke indholdet, men det er ret kryptisk.
Outputtet viser et klassenavn Complex efterfulgt af '@' karakter og derefter objektets hashCode. Dette er standardoutputtet, der udskrives med toString () -metoden i objektklassen.
Hvis vi ønsker den korrekte output, er vi nødt til at tilsidesætte metoden toString () i vores applikation.
Følgende Java-program viser, hvordan man tilsidesætter metoden toString () for at udskrive indholdet af det komplekse objekt.
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:
Ovenstående program viser, at metoden toString () tilsidesættes for at returnere indholdet af det komplekse objekt i det givne format (real + i * imaginær).
Generelt, når vi vil vise klasseobjektet ved hjælp af enten print () eller println (), er det altid tilrådeligt at tilsidesætte metoden toString (), så vi får den korrekte output.
Ofte stillede spørgsmål
Q # 1) Hvorfor bruge .equals i stedet for == Java?
hvordan man kører en .swf-fil
Svar: Vi bruger ‘==’ til at sammenligne primitive typer som int, char, boolean osv. Vi bruger lig () til at sammenligne objekter (foruddefineret eller brugerdefineret). Vi tilsidesætter normalt ligemetoden () for at sammenligne to objekter, og returværdien af ligemærket () afhænger af den tilsidesatte kode.
Q # 2) Hvad bruges hashCode () og lig () til?
Svar: I Java bruges metoden lig () til at sammenligne lighed mellem to objekter. Metoden hashCode () returnerer hashCode for objektet. Mens metoden lig () bruges med de fleste objekter til at teste deres lighed, bruges hashCode mest i hash-samlinger som HashTable, HashMap, HashSet osv.
Q # 3) Kan vi ændre argumentlisten for den tilsidesatte metode?
Svar: Nej. Når vi tilsidesætter metoden, holder vi metodesignaturen eller prototypen for metoden den samme også i underklassen. Så vi kan ikke ændre antallet af parametre i den tilsidesatte metode.
Q # 4) Hvorfor tilsidesætter vi toString ()?
Svar: Når metoden toString () tilsidesættes, kan vi returnere værdierne for det objekt, som toString () -metoden tilsidesættes uden at skrive for meget kode. Dette skyldes, at java-kompilatoren påkalder metoden toString (), når vi udskriver et objekt.
Spørgsmål nr. 5) Hvad ville der ske, hvis du ikke tilsidesætter metoden toString ()?
Svar: Hvis vi ikke tilsidesætter metoden toString (), får vi ingen oplysninger om objektets egenskaber eller tilstand. Vi ved ikke, hvad der faktisk er inde i objektet. Så alle klasser skal tilsidesætte metoden toString ().
Dette skyldes, at standardimplementeringen af toString () -metoden viser strengrepræsentationen, men når vi bruger standard toString () -implementeringen på objektet, får vi ikke indholdet af objektet.
Konklusion
I denne vejledning diskuterede vi om tilsidesættelse af et par foruddefinerede Java-metoder, og vi så også, hvorfor vi har brug for at tilsidesætte dem.
Når vi beskæftiger os med objekter, kan standardimplementering af metoder som lig med (), sammenligne til () og toString () muligvis ikke give de korrekte oplysninger. Derfor går vi for at tilsidesætte.
=> Se på Java Beginners Guide her.
Anbefalet læsning
- Java String Tutorial | Java strengmetoder med eksempler
- Java-tråde med metoder og livscyklus
- Java strenglængde () Metode med eksempler
- Vend en matrix i Java - 3 metoder med eksempler
- Sådan bruges Java toString-metoden?
- Java-strengindeks Af metode med kodeeksempler
- Java String indeholder () Metodevejledning med eksempler
- Java String Split () Metode - Sådan opdeles en streng i Java