logo

Nepaisymas Java

„Java“ versijoje nepaisymas yra funkcija, leidžianti poklasiui arba antrinei klasei pateikti konkretų metodo įgyvendinimą, kurį jau teikia viena iš jos superklasių arba pirminių klasių. Kai poklasyje esantis metodas turi tą patį pavadinimą, tuos pačius parametrus arba parašą ir tą patį grąžinimo tipą (arba potipį) kaip ir jo superklasės metodas, tada sakoma, kad poklasio metodas yra toks. nepaisyti metodas super-klasėje.

fcfs

Metodo nepaisymas yra vienas iš būdų, kuriuo „Java“ pasiekia Vykdymo laiko polimorfizmas . Vykdomo metodo versija bus nustatyta pagal objektą, kuris naudojamas jį iškviesti. Jei metodui iškviesti naudojamas pagrindinės klasės objektas, bus vykdoma pagrindinės klasės versija, tačiau jei metodui iškviesti naudojamas poklasio objektas, bus vykdoma antrinės klasės versija. Kitaip tariant, tai objekto, į kurį kalbama, tipas (ne nuorodos kintamojo tipas), kuris nustato, kuri nepaisyto metodo versija bus vykdoma.



„Java“ metodo nepaisymo pavyzdys

Žemiau pateikiamas „Java“ metodo nepaisymo įgyvendinimas:

Java




// Java program to demonstrate> // method overriding in java> // Base Class> class> Parent {> >void> show() { System.out.println(>'Parent's show()'>); }> }> // Inherited class> class> Child>extends> Parent {> >// This method overrides show() of Parent> >@Override> void> show()> >{> >System.out.println(>'Child's show()'>);> >}> }> // Driver class> class> Main {> >public> static> void> main(String[] args)> >{> >// If a Parent type reference refers> >// to a Parent object, then Parent's> >// show is called> >Parent obj1 =>new> Parent();> >obj1.show();> >// If a Parent type reference refers> >// to a Child object Child's show()> >// is called. This is called RUN TIME> >// POLYMORPHISM.> >Parent obj2 =>new> Child();> >obj2.show();> >}> }>

>

>

Išvestis

Parent's show() Child's show()>

„Java“ metodo nepaisymo taisyklės

1. Nepaisymas ir prieigos modifikatoriai

The prieigos modifikatorius nepaisantis metodas gali suteikti daugiau, bet ne mažiau prieigos nei nepaisomas metodas. Pavyzdžiui, saugomo egzemplioriaus metodas superklasėje gali būti viešas, bet ne privatus, poklasyje. Tai padarius, bus sukurta kompiliavimo laiko klaida.

Java




// A Simple Java program to demonstrate> // Overriding and Access-Modifiers> class> Parent {> >// private methods are not overridden> >private> void> m1()> >{> >System.out.println(>'From parent m1()'>);> >}> >protected> void> m2()> >{> >System.out.println(>'From parent m2()'>);> >}> }> class> Child>extends> Parent {> >// new m1() method> >// unique to Child class> >private> void> m1()> >{> >System.out.println(>'From child m1()'>);> >}> >// overriding method> >// with more accessibility> >@Override> public> void> m2()> >{> >System.out.println(>'From child m2()'>);> >}> }> // Driver class> class> Main {> >public> static> void> main(String[] args)> >{> >Parent obj1 =>new> Parent();> >obj1.m2();> >Parent obj2 =>new> Child();> >obj2.m2();> >}> }>

>

>

Išvestis

From parent m2() From child m2()>

2. Galutiniai metodai negali būti nepaisomi

Jei nenorime, kad metodas būtų nepaisomas, paskelbiame jį kaip galutinis . Prašau pažiūrėk Galutinis naudojimas su paveldėjimu .

Java




// A Java program to demonstrate that> // final methods cannot be overridden> class> Parent {> >// Can't be overridden> >final> void> show() {}> }> class> Child>extends> Parent {> >// This would produce error> >void> show() {}> }>

>

>

Išvestis

13: error: show() in Child cannot override show() in Parent  void show() { }  ^  overridden method is final>

3. Statinių metodų negalima nepaisyti (metodo nepaisymas vs metodo slėpimas):

Kai apibrėžiate statinį metodą su tuo pačiu parašu kaip ir statinį metodą bazinėje klasėje, jis vadinamas slėpimo būdas . Šioje lentelėje apibendrinama, kas nutinka, kai apibrėžiate metodą su tuo pačiu parašu kaip metodą superklasėje.

Superklasės egzempliorių metodas Superklasės statinis metodas
Poklasio egzempliorių metodas Nepaisoma Sugeneruoja kompiliavimo laiko klaidą
Poklasis Statinis metodas Sugeneruoja kompiliavimo laiko klaidą Slepia

Java




// Java program to show that> // if the static method is redefined by> // a derived class, then it is not> // overriding, it is hiding> class> Parent {> >// Static method in base class> >// which will be hidden in subclass> >static> void> m1()> >{> >System.out.println(>'From parent '> >+>'static m1()'>);> >}> >// Non-static method which will> >// be overridden in derived class> >void> m2()> >{> >System.out.println(> >'From parent '> >+>'non - static(instance) m2() '>);> >}> }> class> Child>extends> Parent {> >// This method hides m1() in Parent> >static> void> m1()> >{> >System.out.println(>'From child static m1()'>);> >}> >// This method overrides m2() in Parent> >@Override> public> void> m2()> >{> >System.out.println(> >'From child '> >+>'non - static(instance) m2() '>);> >}> }> // Driver class> class> Main {> >public> static> void> main(String[] args)> >{> >Parent obj1 =>new> Child();> >// As per overriding rules this> >// should call to class Child static> >// overridden method. Since static> >// method can not be overridden, it> >// calls Parent's m1()> >obj1.m1();> >// Here overriding works> >// and Child's m2() is called> >obj1.m2();> >}> }>

>

>

Išvestis

From parent static m1() From child non - static(instance) m2()>

4. Privatūs metodai negali būti nepaisomi

Privatūs metodai Negalima nepaisyti, nes jie yra susieti kompiliavimo metu. Todėl net negalime nepaisyti privačių metodų poklasyje. (Žr tai Norėdami gauti daugiau informacijos).

Java


paslėptos programos



class> SuperClass {> >private> void> privateMethod()> >{> >System.out.println(> >'This is a private method in SuperClass'>);> >}> >public> void> publicMethod()> >{> >System.out.println(> >'This is a public method in SuperClass'>);> >privateMethod();> >}> }> class> SubClass>extends> SuperClass {> >// This is a new method with the same name as the> >// private method in SuperClass> >private> void> privateMethod()> >{> >System.out.println(> >'This is a private method in SubClass'>);> >}> >// This method overrides the public method in SuperClass> >public> void> publicMethod()> >{> >System.out.println(> >'This is a public method in SubClass'>);> >privateMethod();>// calls the private method in> >// SubClass, not SuperClass> >}> }> public> class> Test {> >public> static> void> main(String[] args)> >{> >SuperClass obj1 =>new> SuperClass();> >obj1.publicMethod();>// calls the public method in> >// SuperClass> >SubClass obj2 =>new> SubClass();> >obj2.publicMethod();>// calls the overridden public> >// method in SubClass> >}> }>

>

>

Išvestis

This is a public method in SuperClass This is a private method in SuperClass This is a public method in SubClass This is a private method in SubClass>

5. Nepaisomasis metodas turi turėti tą patį grąžinimo tipą (arba potipį)

Pradedant nuo 5.0 versijos „Java“, antrinėje klasėje galimi skirtingi nepaisančio metodo grąžinimo tipai, tačiau vaiko grąžinimo tipas turi būti pirminio grąžinimo tipo potipis. Šis reiškinys žinomas kaip kovarianto grąžos tipas .

Java




class> SuperClass {> >public> Object method()> >{> >System.out.println(> >'This is the method in SuperClass'>);> >return> new> Object();> >}> }> class> SubClass>extends> SuperClass {> >public> String method()> >{> >System.out.println(> >'This is the method in SubClass'>);> >return> 'Hello, World!'>;> >}> }> public> class> Test {> >public> static> void> main(String[] args)> >{> >SuperClass obj1 =>new> SuperClass();> >obj1.method();> >SubClass obj2 =>new> SubClass();> >obj2.method();> >}> }>

>

>

Išvestis

This is the method in SuperClass This is the method in SubClass>

6. Nepaisyto metodo iškvietimas iš poklasio

Pirminės klasės metodą galime iškviesti nepaisydami metodu, naudodami super raktažodis .

Java




// A Java program to demonstrate that overridden> // method can be called from sub-class> // Base Class> class> Parent {> >void> show() { System.out.println(>'Parent's show()'>); }> }> // Inherited class> class> Child>extends> Parent {> >// This method overrides show() of Parent> >@Override> void> show()> >{> >super>.show();> >System.out.println(>'Child's show()'>);> >}> }> // Driver class> class> Main {> >public> static> void> main(String[] args)> >{> >Parent obj =>new> Child();> >obj.show();> >}> }>

>

>

Išvestis

Parent's show() Child's show()>

Valdymas ir konstruktorius

Negalime nepaisyti konstruktoriaus, nes pagrindinė ir antrinė klasė niekada negali turėti konstruktoriaus tuo pačiu pavadinimu (konstruktoriaus pavadinimas visada turi būti toks pat kaip klasės pavadinimas).

Nepaisymas ir išimčių tvarkymas

Toliau pateikiamos dvi taisyklės, į kurias reikia atkreipti dėmesį, kai nepaisoma su išimčių tvarkymu susijusių metodų.

Taisyklė #1

Jei superklasės nepaisymo metodas nepateikia išimties, poklasio nepaisymo metodas gali išmesti tik nepažymėta išimtis , išmetus pažymėtą išimtį, atsiras kompiliavimo laiko klaida.

Java




// Java program to demonstrate overriding when> // superclass method does not declare an exception> class> Parent {> >void> m1() { System.out.println(>'From parent m1()'>); }> >void> m2() { System.out.println(>'From parent m2()'>); }> }> class> Child>extends> Parent {> >@Override> >// no issue while throwing unchecked exception> >void> m1()>throws> ArithmeticException> >{> >System.out.println(>'From child m1()'>);> >}> >@Override> >// compile-time error> >// issue while throwing checked exception> >void> m2()>throws> Exception> >{> >System.out.println(>'From child m2'>);> >}> }>

>

>

Išvestis

error: m2() in Child cannot override m2() in Parent  void m2() throws Exception{ System.out.println('From child m2');}  ^  overridden method does not throw Exception>

2 taisyklė

Jei viršklasės nepaisymo metodas iš tikrųjų sukuria išimtį, poklasio nepaisymo metodas gali pateikti tik tą pačią poklasio išimtį. Išimtys iš tėvų Išimčių hierarchija sukels kompiliavimo laiko klaidą. Be to, nėra problemų, jei poklasio nepaisytas metodas nedaro jokios išimties.

Java




// Java program to demonstrate overriding when> // superclass method does declare an exception> class> Parent {> >void> m1()>throws> RuntimeException> >{> >System.out.println(>'From parent m1()'>);> >}> }> class> Child1>extends> Parent {> >@Override> >// no issue while throwing same exception> >void> m1()>throws> RuntimeException> >{> >System.out.println(>'From child1 m1()'>);> >}> }> class> Child2>extends> Parent {> >@Override> >// no issue while throwing subclass exception> >void> m1()>throws> ArithmeticException> >{> >System.out.println(>'From child2 m1()'>);> >}> }> class> Child3>extends> Parent {> >@Override> >// no issue while not throwing any exception> >void> m1()> >{> >System.out.println(>'From child3 m1()'>);> >}> }> class> Child4>extends> Parent {> >@Override> >// compile-time error> >// issue while throwing parent exception> >void> m1()>throws> Exception> >{> >System.out.println(>'From child4 m1()'>);> >}> }>

>

>

Išvestis

error: m1() in Child4 cannot override m1() in Parent  void m1() throws Exception  ^  overridden method does not throw Exception>

Viršutinis ir abstraktus metodas

Abstraktūs metodai sąsajoje arba abstrakčioje klasėje turi būti nepaisyti išvestinėse konkrečiose klasėse, kitaip bus išmesta kompiliavimo laiko klaida.

Nepaisymas ir sinchronizuotas / griežtas fp metodas

Sinchronizuoto / griežto fp modifikatoriaus buvimas su metodu neturi įtakos nepaisymo taisyklėms, t. y. gali būti, kad sinchronizuotas / griežtas fp metodas gali nepaisyti nesinchronizuoto / griežto fp metodo ir atvirkščiai.

Pastaba:

  1. C++ kalba mums reikia virtualus raktinis žodis pasiekti viršų ar Vykdymo laiko polimorfizmas . Pagal numatytuosius nustatymus Java metodai yra virtualūs.
  2. Galime turėti kelių lygių metodų nepaisymą.

Java




// A Java program to demonstrate> // multi-level overriding> // Base Class> class> Parent {> >void> show() { System.out.println(>'Parent's show()'>); }> }> // Inherited class> class> Child>extends> Parent {> >// This method overrides show() of Parent> >void> show() { System.out.println(>'Child's show()'>); }> }> // Inherited class> class> GrandChild>extends> Child {> >// This method overrides show() of Parent> >void> show()> >{> >System.out.println(>'GrandChild's show()'>);> >}> }> // Driver class> class> Main {> >public> static> void> main(String[] args)> >{> >Parent obj1 =>new> GrandChild();> >obj1.show();> >}> }>

>

>

Python Rūšiavimo žodynas
Išvestis

GrandChild's show()>

Metodo nepaisymas vs metodo perkrovimas

1. Perkrovimas yra apie tą patį metodą su skirtingais parašais. Nepaisymas yra maždaug tas pats metodas ir tas pats parašas, bet skirtingos klasės, sujungtos per paveldėjimą.

2. Perkrovimas yra kompiliatoriaus laiko polimorfizmo pavyzdys, o nepaisymas yra vykdymo laiko pavyzdys polimorfizmas .

DUK apie „Java“ metodo nepaisymą

Q1. Kas yra metodo nepaisymas?

Kaip minėta anksčiau, nepaisyti metodai leidžia palaikyti „Java“. vykdymo laiko polimorfizmas . Polimorfizmas yra būtinas objektiniam programavimui dėl vienos priežasties: jis leidžia bendrajai klasei nurodyti metodus, kurie bus bendri visoms jos išvestinėms priemonėms, o poklasiams leidžia apibrėžti konkretų kai kurių arba visų tų metodų įgyvendinimą. Nepaisyti metodai yra dar vienas būdas, kaip „Java“ įgyvendina vieną sąsają, kelių metodų polimorfizmo aspektą. Dinaminis metodo išsiuntimas yra vienas iš galingiausių mechanizmų, kuriuos į objektą orientuotas dizainas suteikia pakartotiniam kodo naudojimui ir tvirtumui. Galimybė egzistuoti kodų bibliotekoms iškviesti metodus naujų klasių egzemplioriuose neperkompiliuojant ir išlaikant švarią abstrakčią sąsają yra labai galingas įrankis. Nepaisyti metodai leidžia iškviesti bet kurios išvestinių klasių metodus net nežinant išvestinės klasės objekto tipo.

Q2. Kada taikyti metodo nepaisymą? (su pavyzdžiu)

Nepaisymas ir Paveldėjimas : Dalis rakto į sėkmingą polimorfizmo taikymą yra supratimas, kad superklasės ir poklasiai sudaro hierarchiją, kuri pereina nuo mažesnės prie didesnės specializacijos. Tinkamai naudojama superklasė suteikia visus elementus, kuriuos poklasis gali naudoti tiesiogiai. Ji taip pat apibrėžia tuos metodus, kuriuos išvestinė klasė turi įgyvendinti pati. Tai leidžia poklasiui lanksčiai apibrėžti savo metodus, tačiau vis tiek užtikrina nuoseklią sąsają. Taigi, derinant paveldėjimą su nepaisytais metodais, superklasė gali apibrėžti bendrą metodų formą, kurią naudos visi jos poklasiai. Pažvelkime į praktiškesnį pavyzdį, kuriame naudojamas metodo nepaisymas. Apsvarstykite organizacijos darbuotojų valdymo programinę įrangą, tegul kode yra paprasta bazinė klasė Darbuotojas, o klasė turi tokius metodus kaip pakelti atlyginimą(), transfer(), skatinti(), .. ir tt. Skirtingi darbuotojų tipai, pvz., vadovas, inžinierius, ..etc gali turėti metodų įgyvendinimą bazinėje klasėje Employee. Mūsų pilnoje programinėje įrangoje mums tereikia visur perduoti darbuotojų sąrašą ir iškviesti atitinkamus metodus, net nežinodami darbuotojo tipo. Pavyzdžiui, kartodami per darbuotojų sąrašą galime nesunkiai pakelti atlyginimą visiems darbuotojams. Kiekvienas darbuotojų tipas gali turėti savo logiką savo klasėje, mums nereikia nerimauti, nes jei konkrečiam darbuotojo tipui yra RaiseSalary(), bus iškviestas tik šis metodas.

Java




// Java program to demonstrate application> // of overriding in Java> // Base Class> class> Employee {> >public> static> int> base =>10000>;> >int> salary() {>return> base; }> }> // Inherited class> class> Manager>extends> Employee {> >// This method overrides salary() of Parent> >int> salary() {>return> base +>20000>; }> }> // Inherited class> class> Clerk>extends> Employee {> >// This method overrides salary() of Parent> >int> salary() {>return> base +>10000>; }> }> // Driver class> class> Main {> >// This method can be used to print the salary of> >// any type of employee using base class reference> >static> void> printSalary(Employee e)> >{> >System.out.println(e.salary());> >}> >public> static> void> main(String[] args)> >{> >Employee obj1 =>new> Manager();> >// We could also get type of employee using> >// one more overridden method.loke getType()> >System.out.print(>'Manager's salary : '>);> >printSalary(obj1);> >Employee obj2 =>new> Clerk();> >System.out.print(>'Clerk's salary : '>);> >printSalary(obj2);> >}> }>

>

>

Išvestis

Manager's salary : 30000 Clerk's salary : 20000>

Susijęs straipsnis

  • Dinaminis metodo išsiuntimas arba vykdymo laiko polimorfizmas Java
  • Objektų klasės metodo nepaisymas equals ().
  • Objektų klasės metodo toString() nepaisymas
  • Java perkrovimas
  • Java programos išvestis | 18 rinkinys (nepaisoma)