overriding predefined methods java
Deze tutorial legt uit hoe je vooraf gedefinieerde methoden zoals equals (), hashCode (), CompareTo (), etc. in Java kunt overschrijven met voorbeelden:
In onze vorige tutorial hebben we runtime-polymorfisme in Java besproken. Runtime-polymorfisme in Java wordt geïmplementeerd met behulp van methode-overschrijving. Het overschrijven van methoden omvat het opnieuw definiëren van de bovenliggende klassemethode in de subklasse.
Java heeft verschillende voorgedefinieerde methoden zoals equals (), hashCode (), CompareTo (), toString (), enz. Die algemeen worden gebruikt voor algemene objecten, ongeacht tot welke klasse ze behoren. Maar om deze methoden voor alle objecten te laten werken, moeten we deze methoden overschrijven of hun implementaties opnieuw definiëren, zodat ze kunnen werken met de gegevens die we willen.
Bezoek hier om Java vanaf het begin te leren.
In deze tutorial bespreken we het overschrijven van al deze methoden, samen met de gevolgen als we deze methoden niet negeren.
Wat je leert:
- Overriding equals () en hashCode () -methoden in Java
- Statische methode overschrijven in Java
- CompareTo () in Java overschrijven
- Overschrijf de methode toString () in Java
- Veel Gestelde Vragen
- Gevolgtrekking
- Aanbevolen literatuur
Overriding equals () en hashCode () -methoden in Java
We gebruiken de equals () - methode in Java om twee objecten te vergelijken. Deze methode retourneert true als de objecten gelijk zijn en false als ze niet gelijk zijn.
Er worden twee manieren gebruikt om de gelijkheid van twee objecten te vergelijken.
# 1) Ondiepe vergelijking
Ondiepe vergelijking is de standaardimplementatie voor de equals () -methode die is gedefinieerd in de klasse 'java.lang.Object'. Als onderdeel van deze implementatie controleert de methode equals () of twee objecten die worden vergeleken, verwijzingen hebben naar hetzelfde object.
Dit betekent dat als obj1 en obj2 twee objecten zijn, de standaardimplementatie van de methode equals () (ondiepe vergelijking) alleen controleert of de referenties van obj1 en obj2 van hetzelfde object zijn.
Bij oppervlakkige vergelijking wordt geen gegevensinhoud vergeleken.
# 2) Diepgaande vergelijking
Bij een grondige vergelijking vergelijken we de gegevensleden van elk object, d.w.z. de objecten worden vergeleken met betrekking tot de staat. We vergelijken de objecten dus op een diep niveau, inclusief de inhoud.
Om de objecten te vergelijken met behulp van diepe vergelijking, overschrijven we meestal de methode equals ().
Beschouw nu het volgende Java-programma.
Uitgang:
Als we de uitvoer van het bovenstaande programma zien, zegt het dat de objecten niet gelijk zijn, ook al zijn de inhoud van de twee objecten hetzelfde. Dit komt doordat, wanneer de gelijkheid wordt gecontroleerd, wordt bepaald of de twee objecten c1 en c2 naar hetzelfde object verwijzen.
Zoals te zien is in het programma zijn c1 en c2 twee verschillende objecten, het zijn dus verschillende referenties en dat is het resultaat.
Laten we nu een derde referentie c3 maken en deze als volgt gelijkstellen aan c1:
Complex c3 = c1;
In dit geval verwijzen c3 en c1 naar hetzelfde object, en daarom zal (c3 == c1) true retourneren.
Wat het bovenstaande programma deed, was de oppervlakkige vergelijking. Dus hoe controleren we of twee objecten inhoudelijk hetzelfde zijn?
Hier gaan we voor een grondige vergelijking en voor dit doel overschrijven we de methode equals ().
Het volgende programma toont het overschrijven van de methode equals (). We gebruiken dezelfde complexe klasse.
Uitgang:
Nu we een overschreven equals () -methode hebben, laat de uitvoer zien dat de twee objecten gelijk zijn als de inhoud hetzelfde is als we twee objecten vergelijken. Let op de overschreven equals () - methode. Hier controleren we of beide objecten dezelfde referentie hebben. Zo niet, dan controleren we afzonderlijk de inhoud van deze objecten.
Wanneer we in Java de methode equals () overschrijven, is het raadzaam om ook de methode hashCode () te overschrijven. Dit komt omdat als we de methode hashCode () niet overschrijven, elk object een andere hashCode kan hebben.
unix interviewvragen en antwoorden voor ervaren
Dit heeft mogelijk geen invloed op de algemene objecten, maar bepaalde op hash gebaseerde verzamelingen zoals HashTable, HashSet en HashMap werken mogelijk niet correct.
Het volgende programma toont de methoden equals () en hashCode () overschreven.
Uitgang:
In dit programma gebruiken we een hashMap. We hebben de methoden equals () en hashCode () overschreven. Dus als we map.put (e1, 'C ++') zeggen, hashes het naar een bepaalde bucketlocatie. Vervolgens noemen we een map.put (e2, 'Python'). Deze keer zal het naar dezelfde bucket hashen en de vorige waarde vervangen. Dit komt omdat we de hashCode () - methode hebben overschreven.
Statische methode overschrijven in Java
Kunnen we de statische methode in Java negeren?
Voor zover het de statische methode in Java betreft, is het directe antwoord op deze vraag Nee, we kunnen de statische methode niet negeren.
De statische methode wordt aangeroepen met behulp van de klassenaam zelf. We hebben geen object nodig om een statische methode aan te roepen. Dus zelfs als we een methode met hetzelfde prototype in een subklasse declareren, kunnen we het niet overschrijven noemen. In plaats daarvan verbergen we alleen de definitie van de bovenliggende klasse van de statische methode.
Het volgende Java-programma toont de statische methode en de niet-statische methode in een overervingssysteem samen met hun gedrag tijdens runtime.
Uitgang:
Uit de programma-uitvoer kunnen we het volgende concluderen.
- De aanroep van de statische methode wordt altijd gedaan op basis van het type referentie. Dus toen we new_obj. display () in het bovenstaande programma, aangezien de new_obj-referentie van het type class Parent is, wordt de methode display () van Parent class aangeroepen.
- Aan de andere kant worden niet-statische methoden aangeroepen op basis van de inhoud van het referentieobject waarmee de methode wordt aangeroepen. Vandaar dat in het bovenstaande programma de methode new_obj.print () de methode print () van de kindklasse aanroept omdat de inhoud van new_obj het object is van de kindklasse.
Dit verklaart de uitvoer van het bovenstaande programma en we moeten ook de volgende punten onthouden bij het omgaan met statische methoden in het OOP-systeem.
- Een statische methode kan een niet-statische instantiemethode niet verbergen en een niet-statische instantiemethode kan een statische methode niet overschrijven.
- We kunnen de methoden van de bovenliggende klasse in een subklasse overbelasten, maar ze overschrijven of verbergen de methoden van de bovenliggende klasse niet, het zijn eerder nieuwe methoden in de subklasse.
CompareTo () in Java overschrijven
We weten dat de interface java.lang.Comparable een ‘vergelijkTo ()’ - methode biedt waarmee we de objecten in een natuurlijke volgorde kunnen sorteren, zoals lexicale volgorde voor String-objecten, numerieke volgorde voor gehele getallen, enz.
Om sortering in door de gebruiker gedefinieerde objecten of verzamelingen te implementeren, moeten we de methode CompareTo () overschrijven om de verzamelingselementen of door de gebruiker gedefinieerde objecten te sorteren.
Dus wat doet een methode CompareTo ()?
Een methode CompareTo () moet een positieve waarde retourneren als het huidige object groter is dan het doorgegeven object en de negatieve waarde van het huidige object kleiner is dan het doorgegeven object. Als beide objecten gelijk zijn, retourneert de methode CompareTo () nul.
Een ander punt om op te merken is dat de methode equals () en CompareTo () zich consistent met elkaar moeten gedragen. Dit betekent dat als de methode CompareTo () retourneert dat twee objecten gelijk zijn (retourneert nul), we ook dezelfde uitvoer van de methode equals () zouden moeten hebben.
Laten we een Java-programma implementeren dat de methode CompareTo () overschrijft. In dit programma gebruiken we een kleurklasse die twee privévariabelen heeft, namelijk naam en id. We hebben de ‘id’ aan elke kleur gekoppeld en we zullen de methode Compare () overschrijven om kleuren te rangschikken volgens de id.
Uitgang:
In de bovenstaande uitvoer geven we eerst de lijst met kleuren weer en vervolgens de gesorteerde lijst met kleuren. In het programma hebben we de methoden CompareTo () en Compare () overschreven.
Overschrijf de methode toString () in Java
De methode ‘toString ()’ retourneert de String-weergave van een object in Java. Maar als we door de gebruiker gedefinieerde objecten hebben, kan deze methode zich anders gedragen.
Bijvoorbeeld,overweeg het volgende programma.
Uitgang:
Zoals in dit programma wordt getoond, tonen we het complexe klasseobject dat we eerder hebben gedefinieerd. De weergegeven uitvoer is echter niet de inhoud, maar het is nogal cryptisch.
De uitvoer toont een klassenaam Complex gevolgd door het teken ‘@’ en vervolgens de hashCode van het object. Dit is de standaarduitvoer die wordt afgedrukt met de methode toString () van de klasse Object.
Als we de juiste uitvoer willen, moeten we de toString () - methode in onze applicatie overschrijven.
Het volgende Java-programma laat zien hoe u de methode toString () kunt overschrijven om de inhoud van het Complex-object af te drukken.
Uitgang:
Het bovenstaande programma laat zien dat de methode toString () wordt overschreven om de inhoud van het complexe object in het gegeven formaat (real + i * imaginair) te retourneren.
In het algemeen, als we het klasseobject willen weergeven met print () of println (), is het altijd raadzaam om de methode toString () te overschrijven zodat we de juiste uitvoer krijgen.
Veel Gestelde Vragen
V # 1) Waarom .equals gebruiken in plaats van == Java?
Antwoord: We gebruiken ‘==’ om primitieve typen zoals int, char, boolean, enz. Te vergelijken. We gebruiken equals () om objecten te vergelijken (vooraf gedefinieerd of door de gebruiker gedefinieerd). We overschrijven meestal de methode equals () om twee objecten te vergelijken en de geretourneerde waarde van de equals () hangt af van de overschreven code.
Vraag 2) Waar worden hashCode () en equals () voor gebruikt?
Antwoord: In Java wordt de methode equals () gebruikt om de gelijkheid van twee objecten te vergelijken. De methode hashCode () retourneert de hashCode van het object. Hoewel de methode equals () bij de meeste objecten wordt gebruikt om hun gelijkheid te testen, wordt de hashCode meestal gebruikt in hashverzamelingen zoals HashTable, HashMap, HashSet, enz.
Java-programma's interviewvragen en antwoorden
V # 3) Kunnen we de lijst met argumenten van de overschreven methode wijzigen?
Antwoord: Nee. Als we de methode overschrijven, houden we de methodehandtekening of het prototype van de methode ook hetzelfde in de subklasse. We kunnen het aantal parameters in de overschreven methode dus niet wijzigen.
V # 4) Waarom overschrijven we toString ()?
Antwoord: Als de methode toString () wordt overschreven, kunnen we de waarden van het object retourneren waarvoor de methode toString () wordt overschreven zonder al te veel code te schrijven. Dit komt doordat de java-compiler de methode toString () aanroept wanneer we een object afdrukken.
V # 5) Wat zou er gebeuren als u de methode toString () niet overschrijft?
Antwoord: Als we de methode toString () niet overschrijven, krijgen we geen informatie over de eigenschappen of staat van het object. We zullen niet weten wat er werkelijk in het object zit. Dus alle klassen zouden de toString () - methode moeten overschrijven.
Dit komt doordat de standaardimplementatie van de toString () -methode de String-representatie weergeeft, maar als we de standaardtoString () -implementatie op het object gebruiken, krijgen we de inhoud van het object niet.
Gevolgtrekking
In deze tutorial hebben we gesproken over het overschrijven van een paar vooraf gedefinieerde Java-methoden en we hebben ook gezien waarom we ze moeten overschrijven.
Wanneer we met objecten te maken hebben, geven de standaardimplementaties van methoden zoals equals (), CompareTo () en toString () mogelijk niet de juiste informatie. Daarom gaan we voor overheersing.
Bekijk hier de Java-beginnershandleiding.
Aanbevolen literatuur
- Zelfstudie voor Java String | Java String-methoden met voorbeelden
- Java-threads met methoden en levenscyclus
- Java String length () Methode met voorbeelden
- Keer een array in Java om - 3 methoden met voorbeelden
- Hoe de Java toString-methode te gebruiken?
- Java String indexOf methode met codevoorbeelden
- Java String bevat () Method Tutorial met voorbeelden
- Java String Split () -methode - Hoe een string in Java te splitsen