overriding predefined methods java
Овај водич објашњава како надјачати унапред дефинисане методе попут екуалс (), хасхЦоде (), цомпареТо () итд. У Јави са примерима:
У нашем претходном водичу разговарали смо о полиморфизму извршавања у Јави. Рунтиме полиморфизам у Јави имплементиран је применом методе која замењује. Замена методе укључује редефинисање методе родитељске класе у подкласи.
Јава има разне унапред дефинисане методе попут екуалс (), хасхЦоде (), цомпареТо (), тоСтринг () итд. Које се обично користе за опште објекте, без обзира којој класи припадају. Али да би ове методе функционисале за све објекте, морамо да их заменимо или редефинишемо њихове примене како би могле да раде са подацима које желимо.
=> Посетите овде да бисте научили Јаву из нуле.
У овом упутству ћемо размотрити надјачавање свих ових метода заједно са последицама ако ове методе не поништимо.
Шта ћете научити:
- Замена метода екуалс () И хасхЦоде () у Јави
- Замена статичке методе у Јави
- Замена цомпареТо () у Јави
- Замените методу тоСтринг () у Јави
- Често постављана питања
- Закључак
- Препоручено читање
Замена метода екуалс () И хасхЦоде () у Јави
Користимо методу екуалс () у Јави за поређење два објекта. Ова метода враћа труе када су објекти једнаки и фалсе када нису једнаки.
За упоређивање једнакости два предмета користе се два начина.
# 1) Плитко поређење
Плитко поређење је подразумевана примена методе екуалс () дефинисане у класи „јава.ланг.Објецт“. Као део ове имплементације, метода екуалс () ће проверити да ли два објекта која се упоређују имају референце које се односе на исти објекат.
То значи да ако су обј1 и обј2 два објекта, тада ће подразумевана имплементација методе екуалс () (плитко поређење) само проверити да ли су референце обј1 и обј2 из истог објекта.
У плитком поређењу, ниједан садржај података се не упоређује.
# 2) Дубинско поређење
У дубинском поређењу, упоређујемо чланове података сваког објекта, тј. Објекти се упоређују у односу на стање. Дакле, упоређујемо објекте на дубоком нивоу укључујући и њихов садржај.
Да бисмо упоредили објекте помоћу дубоког поређења, обично поништимо методу екуалс ().
Сада размотрите следећи Јава програм.
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 '); } } }
Излаз:
Ако видимо излаз горе наведеног програма, он каже да објекти нису једнаки иако је садржај два објекта исти. То је зато што се приликом провере једнакости утврђује да ли се два објекта ц1 и ц2 односе на исти објекат.
Као што се види у програму, ц1 и ц2 су два различита објекта, па су то различите референце и самим тим је и резултирано.
сајтови за тестирање производа који шаљу ствари
Сада креирајмо трећу референцу ц3 и изједначимо је са ц1 на следећи начин:
Комплекс ц3 = ц1;
У овом случају, ц3 и ц1 ће се односити на исти објекат, па ће стога (ц3 == ц1) вратити труе.
Оно што је горе наведени програм урадио је плитко поређење. Па како да проверимо да ли су два предмета иста садржајно?
двоструко повезане листе ц ++
Овде идемо на дубоко поређење и у ту сврху надјачавамо методу екуалс ().
Следећи програм приказује надјачавање методе екуалс (). Користимо исту класу Цомплек.
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 '); } } }
Излаз:
Сада када имамо надјачану методу екуалс (), када упоређујемо два објекта, излаз показује да су два објекта једнака јер је њихов садржај исти. Обратите пажњу на замењену методу екуалс (). Овде проверавамо да ли оба објекта имају исту референцу. Ако не, онда појединачно проверавамо садржај ових предмета.
У Јави, кад год заменимо методу екуалс (), препоручљиво је заменити и методу хасхЦоде (). То је зато што ако не заменимо методу хасхЦоде (), тада сваки објекат може имати различити хасхЦоде.
Ово можда неће ометати опште објекте, али одређене колекције засноване на хешу, као што су ХасхТабле, ХасхСет и ХасхМап, можда неће радити исправно.
Следећи програм приказује надјачане методе екуалс () и хасхЦоде ().
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()); } } }
Излаз:
У овом програму користимо хасхМап. Заменили смо методе екуалс () и хасхЦоде (). Дакле, када кажемо мап.пут (е1, „Ц ++“), хешира до неке сегментарне локације. Даље, називамо мап.пут (е2, „Питхон“). Овај пут ће се хеширати у исти сегмент и заменити претходну вредност. То је зато што смо заменили методу хасхЦоде ().
Замена статичке методе у Јави
Можемо ли заменити статички метод у Јави?
Што се тиче замене статичке методе у Јави, директан одговор на ово питање је Не, не можемо заменити статичку методу.
Статичка метода се позива користећи само име класе. Не треба нам објекат за позивање статичке методе. Дакле, чак и ако декларирамо методу са истим прототипом у подкласи, не можемо је назвати надјачавајућом. Уместо тога, само скривамо дефиницију родитељске класе статичке методе.
Следећи Јава програм приказује статичку методу и нестатичку методу у систему наслеђивања, заједно са њиховим понашањем током извођења.
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(); } }
Излаз:
Из резултата програма можемо закључити следеће.
- Позив статичкој методи увек се врши на основу врсте референце. Отуда када смо позвали нев_обј. дисплаи () у горњем програму, пошто је референца нев_обј врсте класе Родитељ, позива се метода дисплаи () класе Родитељ.
- С друге стране, не-статичке методе се позивају на основу садржаја референтног објекта са којим се метода позива. Стога у горњем програму нев_обј.принт () метода позива методу принт () подређене класе, јер је нев_обј садржај предмет подређене класе.
Ово објашњава излаз горњег програма и морамо да запамтимо и следеће тачке док се бавимо статичким методама у ООП систему.
- Статичка метода не може сакрити не-статичку методу инстанце, а не-статичка метода инстанце не може надјачати статичку методу.
- Можемо преоптеретити методе из родитељске класе у подкласи, али оне нити надјачавају нити сакривају методе родитељске класе, већ су то нове методе у подкласи.
Замена цомпареТо () у Јави
Знамо да интерфејс јава.ланг.Цомпарабле пружа методу ‘цомпареТо ()’ помоћу које можемо сортирати објекте у природном редоследу попут лексичког поретка за Стринг објекте, нумеричког поретка за целобројне итд.
Да бисмо имплементирали сортирање у кориснички дефинисане објекте или колекције, морамо надјачати методу цомпареТо () да бисмо сортирали елементе колекције или кориснички дефинисане објекте.
Па шта чини метода цомпареТо ()?
Метода цомпареТо () мора да врати позитивну вредност ако је тренутни објекат већи од прослеђеног објекта по реду, а негативна вредност тренутног објекта је мања од прослеђеног објекта. Ако су оба објекта једнака, тада ће метода цомпареТо () вратити нулу.
Још једна ствар коју треба приметити је да се метода екуалс () и цомпареТо () треба понашати доследно једни с другима. То значи да ако метода цомпареТо () врати да су два објекта једнака (враћа нулу) онда бисмо требали имати исти излаз и из методе екуалс ().
Применимо Јава програм који поништава методу цомпареТо (). У овом програму користимо класу Цолор која има две приватне променљиве, односно име и ид. Повезали смо ‘ид’ са сваком бојом и заменићемо методу цомпаре () да бисмо распоредили боје према ид-у.
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() + ' , '); }
Излаз:
У горњем излазу прво приказујемо листу боја, а затим сортирану листу боја. У програму смо надјачали методе цомпареТо () и цомпаре ().
Замените методу тоСтринг () у Јави
Метода ‘тоСтринг ()’ враћа Стринг представу објекта у Јави. Али када имамо кориснички дефинисане објекте, тада се овај метод може понашати другачије.
На пример,размотрите следећи програм.
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); } }
Излаз:
Као што је приказано у овом програму, приказујемо објект класе Цомплек који смо раније дефинисали. Међутим, приказани излаз није садржај, већ је прилично тајновит.
Излаз приказује име класе Сложено, праћено знаком ‘@’, а затим хасхЦоде објекта. Ово је задани излаз исписан методом тоСтринг () класе Објецт.
Ако желимо исправан излаз, онда морамо да заменимо методу тоСтринг () у нашој апликацији.
Следећи Јава програм показује како надјачати методу тоСтринг () за штампање садржаја објекта Цомплек.
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); } }
Излаз:
Горњи програм показује да је метода тоСтринг () поништена да би се вратио садржај комплексног објекта у датом формату (реал + и * имагинарни).
Генерално, када желимо да прикажемо објекат класе користећи принт () или принтлн (), увек је препоручљиво заменити методу тоСтринг () како бисмо добили одговарајући излаз.
Често постављана питања
П # 1) Зашто користити .екуалс уместо == Јава?
преузмите све видео записе са ИоуТубе плејлисте
Одговор: Користимо ‘==’ за поређење примитивних типова попут инт, цхар, боолеан итд. Користимо екуалс () за упоређивање објеката (предефинисаних или кориснички дефинисаних). Обично надјачавамо методу екуалс () да бисмо упоређивали два објекта, а повратна вредност екуалс () зависи од замењеног кода.
П # 2) За шта се користи хасхЦоде () и екуалс ()?
Одговор: У Јави се метода екуалс () користи за упоређивање једнакости два објекта. Метода хасхЦоде () враћа хасхЦоде објекта. Док се метода екуалс () користи са већином објеката за тестирање њихове једнакости, хасхЦоде се углавном користи у хеш колекцијама као што су ХасхТабле, ХасхМап, ХасхСет итд.
П # 3) Можемо ли променити листу аргумената надјачане методе?
Одговор: Не. Када заменимо методу, задржавамо исти потпис или прототип методе исти у подкласи. Дакле, не можемо променити број параметара у надјачаној методи.
П # 4) Зашто преписујемо тоСтринг ()?
Одговор: Када је метода тоСтринг () надјачана, можемо вратити вредности објекта за који је метода тоСтринг () замењена без писања превише кода. То је зато што јава компајлер позива методу тоСтринг () када исписујемо објекат.
П # 5) Шта би се догодило ако не замените методу тоСтринг ()?
Одговор: Ако не заменимо методу тоСтринг (), тада нећемо добити никакве информације о својствима или стању објекта. Нећемо знати шта се заправо налази у објекту. Дакле, све класе треба да замене методу тоСтринг ().
То је зато што подразумевана имплементација методе тоСтринг () приказује представљање Стринга, али када користимо подразумевану имплементацију тоСтринг () на објекту, тада нећемо добити садржај објекта.
Закључак
У овом упутству смо разговарали о замени неколико унапред дефинисаних Јава метода, а такође смо видели и зашто их морамо надјачати.
Када се бавимо објектима, подразумеване примене метода попут екуалс (), цомпареТо () и тоСтринг () можда неће дати тачне информације. Отуда идемо на превагу.
=> Овде погледајте водич за почетнике Јава.
Препоручено читање
- Јава Стринг Водич | Јава стринг методе са примерима
- Јава теме са методама и животним циклусом
- Метода дужине Јава низа () Метода са примерима
- Обрни низ у Јави - 3 методе са примерима
- Како се користи Јава тоСтринг метод?
- Јава Стринг индекОф метода са примерима кода
- Јава Стринг садржи () Водич за методе са примерима
- Метода поделе Јава Стринга () - Како раздвојити низ у Јави