logo

Ohitus Javassa

Javassa Overriding on ominaisuus, jonka avulla aliluokka tai alaluokka voi tarjota tietyn menetelmän toteutuksen, jonka jokin sen superluokista tai yläluokista jo tarjoaa. Kun aliluokan menetelmällä on sama nimi, samat parametrit tai allekirjoitus ja sama palautustyyppi (tai alatyyppi) kuin menetelmällä sen superluokassa, silloin alaluokan menetelmän sanotaan olevan ohittaa menetelmä superluokassa.

Menetelmän ohittaminen on yksi tavoista, joilla Java saavuttaa Ajoajan polymorfismi . Suoritettavan menetelmän versio määräytyy sen kutsumiseen käytetyn objektin mukaan. Jos menetelmän kutsumiseen käytetään pääluokan objektia, suoritetaan yläluokan versio, mutta jos aliluokan objektia käytetään menetelmän kutsumiseen, suoritetaan aliluokan versio. Toisin sanoen, se on kohteen tyyppi (ei viitemuuttujan tyyppi), joka määrittää, mikä ohitetun menetelmän versio suoritetaan.



Esimerkki menetelmän ohittamisesta Javassa

Alla on Java Method Overridingin toteutus:

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();> >}> }>

>

>

Lähtö

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

Java-menetelmän ohituksen säännöt

1. Ohitus- ja pääsymuunnokset

The pääsyn muokkaaja ohittava menetelmä voi sallia enemmän mutta ei vähemmän pääsyä kuin ohitettu menetelmä. Esimerkiksi suojattu ilmentymämenetelmä superluokassa voidaan tehdä julkiseksi, mutta ei yksityiseksi, alaluokassa. Tämä aiheuttaa käännösaikavirheen.

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();> >}> }>

json-muotoinen esimerkki
>

>

Lähtö

From parent m2() From child m2()>

2. Lopullisia menetelmiä ei voi ohittaa

Jos emme halua, että menetelmää ohitetaan, julistamme sen olevan lopullinen . Ole hyvä ja katso Finaalin käyttäminen perinnön kanssa .

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() {}> }>

>

>

Lähtö

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

3. Staattisia menetelmiä ei voi ohittaa (menetelmän ohittaminen vs menetelmän piilottaminen):

Kun määrität staattisen menetelmän, jolla on sama allekirjoitus kuin staattisen menetelmän perusluokassa, sitä kutsutaan nimellä menetelmä piilottaa . Seuraavassa taulukossa on yhteenveto siitä, mitä tapahtuu, kun määrität menetelmän, jolla on sama allekirjoitus, kuin superluokan menetelmä.

Superclass-instanssimenetelmä Superluokan staattinen menetelmä
Alaluokan ilmentymämenetelmä Ohitus Luo käännösaikavirheen
Alaluokka Staattinen menetelmä Luo käännösaikavirheen Piilottaa

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();> >}> }>

>

>

Lähtö

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

4. Yksityisiä menetelmiä ei voi ohittaa

Yksityiset menetelmät ei voida ohittaa, koska ne on liitetty käännösaikana. Siksi emme voi edes ohittaa yksityisiä menetelmiä alaluokassa. (Katso Tämä yksityiskohtia varten).

Java




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> >}> }>

shilpa shetty ikä

>

>

Lähtö

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. Ohittavalla menetelmällä on oltava sama palautustyyppi (tai alatyyppi)

Java 5.0:sta eteenpäin on mahdollista käyttää erilaisia ​​palautustyyppejä ohittavalle menetelmälle lapsiluokassa, mutta lapsen palautustyypin tulee olla vanhemman palautustyypin alatyyppi. Tämä ilmiö tunnetaan nimellä kovariantin palautustyyppi .

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();> >}> }>

>

>

Lähtö

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

6. Ohitetun menetelmän kutsuminen alaluokasta

Voimme kutsua yläluokan menetelmää ohittavassa menetelmässä käyttämällä super avainsana .

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();> >}> }>

milloin q1 loppuu

>

>

Lähtö

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

Ohjaus ja rakentaja

Emme voi ohittaa rakentajaa, koska ylä- ja alaluokalla ei voi koskaan olla samannimistä konstruktoria (konstruktorin nimen on aina oltava sama kuin luokan nimen).

Ohitus ja poikkeusten käsittely

Alla on kaksi sääntöä, jotka on huomioitava, kun ohitetaan poikkeuskäsittelyyn liittyvät menetelmät.

Sääntö #1

Jos superluokan ohitettu menetelmä ei anna poikkeusta, alaluokan ohitusmenetelmä voi heittää vain valitsematon poikkeus , tarkistetun poikkeuksen heittäminen johtaa käännösaikavirheeseen.

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'>);> >}> }>

>

>

Lähtö

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>

Sääntö #2

Jos yliluokkien ohitettu menetelmä heittää poikkeuksen, aliluokan ohitusmenetelmä voi heittää vain saman, alaluokan poikkeuksen. Vanhempainpoikkeusten heittäminen Poikkeushierarkia johtaa käännösaikavirheeseen. Ei myöskään ole ongelmaa, jos alaluokan ohitettu menetelmä ei tee mitään poikkeusta.

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()'>);> >}> }>

>

>

Lähtö

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

Ylivoimainen ja abstrakti menetelmä

Abstraktit menetelmät rajapinnassa tai abstraktissa luokassa on tarkoitettu ohitettaviksi johdetuissa konkreettisissa luokissa, muuten syntyy käännösaikavirhe.

Ohitus ja synkronoitu/strictfp-menetelmä

Synkronoidun/strictfp-muuntimen läsnäolo menetelmän kanssa ei vaikuta ohitussääntöihin, eli on mahdollista, että synkronoitu/strictfp-menetelmä voi ohittaa synkronoimattoman/strictfp-menetelmän ja päinvastoin.

Huomautus:

  1. C++:ssa tarvitsemme virtuaalinen avainsana saavuttaa ylivoimainen tai Ajoajan polymorfismi . Javassa menetelmät ovat oletusarvoisesti virtuaalisia.
  2. Meillä voi olla monitasoinen menetelmä ohitus.

Java

ketjutus java-merkkijono




// 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();> >}> }>

>

>

Lähtö

GrandChild's show()>

Menetelmän ohittaminen vs. menetelmän ylikuormitus

1. Ylikuormitus on suunnilleen sama menetelmä, jolla on erilaiset allekirjoitukset. Ohitus tarkoittaa samaa menetelmää ja samaa allekirjoitusta, mutta eri luokkia, jotka on yhdistetty periytymisen kautta.

2. Ylikuormitus on esimerkki kääntäjän aikaisesta polymorfismista ja ohitus on esimerkki ajonaikaisesta polymorfismi .

Usein kysytyt kysymykset Java-menetelmän ohittamisesta

Q1. Mikä on menetelmän ohittaminen?

Kuten aiemmin todettiin, ohitetut menetelmät sallivat Java-tuen ajonaikainen polymorfismi . Polymorfismi on olennaista olio-ohjelmoinnissa yhdestä syystä: sen avulla yleinen luokka voi määrittää menetelmiä, jotka ovat yhteisiä kaikille sen johdannaisille, samalla kun alaluokat voivat määrittää joidenkin tai kaikkien näiden menetelmien erityiset toteutukset. Ohitetut menetelmät ovat toinen tapa, jolla Java toteuttaa polymorfismin yhden rajapinnan, useita menetelmiä. Dynaaminen menetelmän lähetys on yksi tehokkaimmista mekanismeista, jonka olio-suunnittelu tuo koodin uudelleenkäyttöön ja kestävyyteen. Kyky olemassa koodikirjastoja kutsua menetelmiä uusien luokkien esiintymissä ilman uudelleenkääntämistä ja samalla ylläpitää puhdasta abstraktia käyttöliittymää on erittäin tehokas työkalu. Ohitettujen menetelmien avulla voimme kutsua minkä tahansa johdetun luokan menetelmiä edes tietämättä johdetun luokkaobjektin tyyppiä.

Q2. Milloin menetelmän ohitusta sovelletaan? (esimerkillä)

Ylivoimainen ja Perintö : Osa avainta polymorfismin menestyksekkääseen soveltamiseen on ymmärtää, että yliluokat ja alaluokat muodostavat hierarkian, joka siirtyy pienemmästä erikoistumisesta suurempaan. Oikein käytettynä superluokka tarjoaa kaikki elementit, joita alaluokka voi käyttää suoraan. Se määrittelee myös ne menetelmät, jotka johdetun luokan tulee toteuttaa yksinään. Tämä antaa alaluokalle joustavuuden määrittää menetelmänsä, mutta silti varmistaa johdonmukaisen käyttöliittymän. Yhdistämällä periytymisen ohitettuihin menetelmiin superluokka voi siis määrittää niiden menetelmien yleisen muodon, joita kaikki sen alaluokat käyttävät. Katsotaanpa käytännöllisempää esimerkkiä, joka käyttää menetelmän ohittamista. Harkitse organisaation työntekijöiden hallintaohjelmistoa, anna koodissa olla yksinkertainen perusluokka Työntekijä, ja luokassa on menetelmät, kuten raiseSalary(), transfer(), promote(), .. jne. Erilaiset työntekijät, kuten esimies, insinööri, ..etc voi sisältää menetelmien toteutuksia perusluokassa Employee. Täydellisissä ohjelmistoissamme meidän tarvitsee vain välittää luettelo työntekijöistä kaikkialle ja kutsua sopivia menetelmiä tietämättä edes työntekijän tyyppiä. Voimme esimerkiksi helposti nostaa kaikkien työntekijöiden palkkaa selaamalla työntekijäluetteloa. Jokaisella työntekijätyypillä voi olla oma logiikkansa luokassaan, meidän ei tarvitse huolehtia, koska jos raiseSalary() on läsnä tietylle työntekijätyypille, vain tämä menetelmä kutsutaan.

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);> >}> }>

>

>

Lähtö

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

Aiheeseen liittyvä artikkeli

  • Dynamic Method Dispatch tai Runtime Polymorphism Javassa
  • Object-luokan ohitus equals()-metodi
  • Object-luokan toString()-metodin ohittaminen
  • Ylikuormitus javassa
  • Java-ohjelman tulos | Sarja 18 (Ohittava)