overriding predefined methods java
Ovaj tutorial objašnjava kako nadjačati unaprijed definirane metode poput equals (), hashCode (), compareTo () itd. U Javi s primjerima:
U našem prethodnom vodiču razgovarali smo o polimorfizmu izvođenja u Javi. Runtime polimorfizam u Javi provodi se korištenjem nadjačavanja metode. Nadjačavanje metode uključuje redefiniranje metode nadređene klase u podrazredu.
Java ima razne unaprijed definirane metode poput equals (), hashCode (), compareTo (), toString () itd. Koje se obično koriste za opće objekte, bez obzira kojoj klasi pripadaju. Ali da bi ove metode funkcionirale za sve objekte, moramo ih nadvladati ili redefinirati njihove implementacije kako bi mogle raditi s podacima koje želimo.
=> Posjetite ovdje da biste naučili Javu ispočetka.
U ovom uputstvu razgovarat ćemo o nadjačavanju svih ovih metoda zajedno s posljedicama ako te metode ne poništimo.
Što ćete naučiti:
- Nadjačavanje metoda equals () I hashCode () u Javi
- Nadjačavanje statičke metode u Javi
- Nadjačavanje compareTo () u Javi
- Nadjačavanje metode toString () u Javi
- Često postavljana pitanja
- Zaključak
- Preporučena literatura
Nadjačavanje metoda equals () I hashCode () u Javi
Koristimo metodu equals () u Javi za usporedbu dva objekta. Ova metoda vraća true kada su objekti jednaki i false kada nisu jednaki.
Za usporedbu jednakosti dvaju predmeta koriste se dva načina.
# 1) Plitka usporedba
Plitka usporedba zadana je implementacija metode equals () definirane u klasi 'java.lang.Object'. Kao dio ove implementacije, metoda equals () provjerit će imaju li dva objekta koji se uspoređuju reference koje se odnose na isti objekt.
To znači da ako su obj1 i obj2 dva objekta, tada će zadana implementacija metode equals () (plitka usporedba) samo provjeriti jesu li reference obj1 i obj2 iz istog objekta.
U plitkoj usporedbi, ne uspoređuje se sadržaj podataka.
# 2) Dubinska usporedba
U dubinskoj usporedbi uspoređujemo članove podataka svakog objekta, tj. Predmeti se uspoređuju s obzirom na stanje. Dakle, usporedimo objekte na dubokoj razini, uključujući i njihov sadržaj.
Da bismo usporedili objekte pomoću dubinske usporedbe, obično nadjačavamo metodu equals ().
Sada razmotrite sljedeći 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 '); } } } Izlaz:

Ako vidimo izlaz gornjeg programa, on kaže da objekti nisu jednaki iako je sadržaj dvaju objekata isti. To je zato što se prilikom provjere jednakosti utvrđuje odnose li se dva objekta c1 i c2 na isti objekt.
Kao što se vidi u programu, c1 i c2 su dva različita objekta, dakle, to su različite reference i time je rezultirano tako.
Izradimo sada treću referencu c3 i izjednačimo je s c1 kako slijedi:
Kompleks c3 = c1;
U tom će se slučaju c3 i c1 odnositi na isti objekt i stoga će (c3 == c1) vratiti vrijednost true.
Gore navedeni program učinio je plitku usporedbu. Pa kako provjeriti jesu li dva predmeta ista sadržajno?
Ovdje idemo na dubinsku usporedbu i u tu svrhu nadjačavamo metodu equals ().
Sljedeći program prikazuje nadjačavanje metode equals (). Koristimo istu klasu Complex.
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 '); } } }Izlaz:

Sada kada imamo metodu nadjačavanja equals (), kada uspoređujemo dva objekta, izlaz pokazuje da su dva objekta jednaka jer su njihovi sadržaji isti. Obratite pažnju na metodu overridden equals (). Ovdje provjeravamo imaju li oba objekta istu referencu. Ako ne, tada pojedinačno provjeravamo sadržaj tih predmeta.
U Javi, kad god poništimo metodu equals (), poželjno je nadjačati i metodu hashCode (). To je zato što ako ne poništimo metodu hashCode (), tada svaki objekt može imati različiti hashCode.
To možda neće ometati opće objekte, ali određene zbirke temeljene na raspršivanju poput HashTable, HashSet i HashMap možda neće raditi ispravno.
Sljedeći program prikazuje nadjačane metode equals () i 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()); } } }Izlaz:

U ovom programu koristimo hashMap. Nadjačali smo metode equals () i hashCode (). Dakle, kad kažemo map.put (e1, “C ++”), raspršuje se na neko mjesto segmenta. Dalje nazivamo map.put (e2, 'Python'). Ovaj put će se raspršiti u isti segment i zamijeniti prethodnu vrijednost. To je zato što smo nadjačali metodu hashCode ().
Nadjačavanje statičke metode u Javi
Možemo li nadjačati statičku metodu u Javi?
Što se tiče nadjačavanja statičke metode u Javi, izravni odgovor na ovo pitanje je Ne, ne možemo nadjačati statičku metodu.
Statička metoda poziva se pomoću samog naziva klase. Ne treba nam objekt za pozivanje statičke metode. Dakle, čak i ako u podrazredu deklariramo metodu s istim prototipom, ne možemo je nazvati prevladavajućom. Umjesto toga, samo skrivamo definiciju nadređene klase statičke metode.
Sljedeći Java program prikazuje statičku metodu i nestatičku metodu u sustavu nasljeđivanja, zajedno s njihovim ponašanjem u vrijeme izvođenja.
sql intervju za programere pitanja i odgovori pdf
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(); } } Izlaz:

Iz rezultata programa možemo zaključiti sljedeće.
- Poziv statičkoj metodi uvijek se vrši na temelju vrste reference. Stoga kad smo nazvali new_obj. display () u gornjem programu, budući da je referenca new_obj vrste klase Roditelj, naziva se metoda display () klase Roditelj.
- S druge strane, ne-statičke metode pozivaju se na temelju sadržaja referentnog objekta s kojim se metoda poziva. Stoga u gornjem programu metoda new_obj.print () poziva metodu print () podređene klase jer su sadržaji new_obj objekt podređene klase.
To objašnjava izlaz gornjeg programa i moramo se sjetiti i sljedećih točaka dok se bavimo statičkim metodama u OOP sustavu.
- Statička metoda ne može sakriti ne-statičku metodu instance, a nestatična metoda instance ne može nadjačati statičku metodu.
- Možemo preopteretiti metode iz nadređene klase u podklasi, ali one niti nadjačavaju niti sakrivaju metode nadređene klase, već su nove metode u podklasi.
Nadjačavanje compareTo () u Javi
Znamo da sučelje java.lang.Comparable pruža metodu 'compareTo ()' pomoću koje možemo sortirati objekte u prirodnom redoslijedu poput leksičkog poretka za String objekte, numeričkog poretka za Integers itd.
Da bismo implementirali sortiranje u korisnički definirane objekte ili zbirke, moramo nadjačati metodu compareTo () za sortiranje elemenata kolekcije ili korisnički definiranih objekata.
Pa, što čini metoda compareTo ()?
Metoda compareTo () mora vratiti pozitivnu vrijednost ako je trenutni objekt veći od prosljeđenog objekta redom, a negativna vrijednost trenutnog objekta manja je od proslijeđenog objekta. Ako su oba objekta jednaka, tada će metoda compareTo () vratiti nulu.
Sljedeća točka koju treba napomenuti je da se metoda equals () i compareTo () trebaju ponašati dosljedno međusobno. To znači da ako metoda compareTo () vrati da su dva objekta jednaka (vraća nulu) onda bismo trebali imati isti izlaz i iz metode equals ().
Primijenimo Java program koji nadjačava metodu compareTo (). U ovom programu koristimo klasu Color koja ima dvije privatne varijable, tj. Ime i id. Povezali smo ‘id’ sa svakom bojom i nadjačat ćemo metodu compare () kako bismo rasporedili boje prema id-u.
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() + ' , '); } Izlaz:

U gornjem izlazu prvo prikazujemo popis boja, a zatim sortirani popis boja. U programu smo nadjačali metode compareTo () i compare ().
Nadjačavanje metode toString () u Javi
Metoda ‘toString ()’ vraća String predstavu objekta u Javi. Ali kada imamo korisnički definirane objekte, tada se ova metoda može ponašati drugačije.
Na primjer,razmotrite sljedeći 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); } } Izlaz:

Kao što je prikazano u ovom programu, prikazujemo objekt klase Complex koji smo definirali ranije. Međutim, prikazani izlaz nije sadržaj, već je prilično tajnovit.
Na izlazu se prikazuje naziv klase Complex nakon kojeg slijedi znak '@', a zatim hashCode objekta. Ovo je zadani izlaz ispisan metodom toString () klase Objekt.
Ako želimo ispravan izlaz, moramo nadjačati metodu toString () u našoj aplikaciji.
Sljedeći Java program pokazuje kako nadjačati metodu toString () za ispis sadržaja složenog objekta.
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); } } Izlaz:

Gornji program pokazuje da je metoda toString () nadjačana da bi se vratio sadržaj složenog objekta u danom formatu (real + i * imaginarni).
Općenito, kada želimo prikazati objekt klase pomoću print () ili println (), uvijek je poželjno nadjačati metodu toString () kako bismo dobili odgovarajući izlaz.
Često postavljana pitanja
P # 1) Zašto koristiti .equals umjesto == Java?
Odgovor: Koristimo ‘==’ za usporedbu primitivnih tipova poput int, char, boolean itd. Koristimo equals () za usporedbu objekata (unaprijed definiranih ili korisnički definiranih). Obično nadjačavamo metodu equals () da bismo uspoređivali dva objekta, a povratna vrijednost equals () ovisi o nadjačanom kodu.
P # 2) Za što se koriste hashCode () i equals ()?
Odgovor: U Javi se metoda equals () koristi za usporedbu jednakosti dvaju objekata. Metoda hashCode () vraća hashCode objekta. Iako se metoda equals () koristi s većinom objekata za testiranje njihove jednakosti, hashCode se uglavnom koristi u hash kolekcijama poput HashTable, HashMap, HashSet itd.
P # 3) Možemo li promijeniti popis argumenata nadjačane metode?
Odgovor: Ne. Kada nadjačamo metodu, zadržavamo isti potpis ili prototip metode isti u podrazredu. Dakle, ne možemo promijeniti broj parametara u nadjačanoj metodi.
P # 4) Zašto nadjačavamo toString ()?
Odgovor: Kada je metoda toString () nadjačana, možemo vratiti vrijednosti objekta za koji je metoda toString () poništena bez pisanja previše koda. To je zato što java kompajler poziva metodu toString () kada ispisujemo objekt.
P # 5) Što bi se dogodilo ako ne nadjačate metodu toString ()?
Odgovor: Ako ne poništimo metodu toString (), tada nećemo dobiti nikakve informacije o svojstvima ili stanju objekta. Nećemo znati što se zapravo nalazi u objektu. Dakle, sve bi klase trebale nadjačati metodu toString ().
To je zato što zadana implementacija metode toString () prikazuje predstavljanje Stringa, ali kada koristimo zadanu implementaciju toString () na objektu, tada nećemo dobiti sadržaj objekta.
Zaključak
U ovom smo tutorijalu razgovarali o nadjačavanju nekoliko unaprijed definiranih Java metoda, a također smo vidjeli i zašto ih moramo nadjačati.
Kada se bavimo objektima, zadane implementacije metoda poput equals (), compareTo () i toString () možda neće dati točne informacije. Stoga idemo na prevladavanje.
=> Ovdje pogledajte Vodič za početnike za Java.
Preporučena literatura
- Java String Vodič | Metode Java niza s primjerima
- Java niti s metodama i životnim ciklusom
- Duljina Java niza () Metoda s primjerima
- Obrnuti niz u Javi - 3 metode s primjerima
- Kako koristiti Java toString metodu?
- Java String indexOf metoda s primjerima koda
- Java String sadrži () Vodič za metode s primjerima
- Metoda razdvajanja Java niza () - Kako podijeliti niz u Javi