V Javi je preglasitev funkcija, ki omogoča podrazredu ali podrejenemu razredu, da zagotovi specifično izvedbo metode, ki jo že zagotavlja eden od njegovih nadrazredov ali nadrejenih razredov. Če ima metoda v podrazredu isto ime, enake parametre ali podpis in isti vrnjeni tip (ali podtip) kot metoda v njenem nadrazredu, se za metodo v podrazredu reče, da preglasiti metoda v super-razredu.
Preglasitev metode je eden od načinov, s katerimi Java doseže Polimorfizem izvajalnega časa . Različico metode, ki se izvaja, bo določil objekt, ki se uporablja za njen priklic. Če se za priklic metode uporabi objekt nadrejenega razreda, se izvede različica v nadrejenem razredu, če pa se za priklic metode uporabi objekt podrazreda, se izvede različica v podrejenem razredu. Z drugimi besedami, to je vrsta predmeta, na katerega se nanaša (ne vrsta referenčne spremenljivke), ki določa, katera različica preglasene metode bo izvedena.
Primer preglasitve metode v Javi
Spodaj je implementacija preglasitve metode Java:
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();> >}> }> |
>
>Izhod
Parent's show() Child's show()>
Pravila za preglasitev metode Java
1. Preglasitev in modifikatorji dostopa
The modifikator dostopa za preglasitveno metodo lahko dovoli več, vendar ne manj dostopa kot preglasljena metoda. Na primer, zaščitena metoda primerka v nadrazredu je lahko v podrazredu javna, vendar ne zasebna. S tem boste ustvarili napako med prevajanjem.
array vs arraylist
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();> >}> }> |
>
>Izhod
From parent m2() From child m2()>
2. Končnih metod ni mogoče preglasiti
Če ne želimo, da se metoda preglasi, jo deklariramo kot dokončno . Prosim poglej Uporaba končnega z dedovanjem .
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() {}> }> |
>
>
Izhod
13: error: show() in Child cannot override show() in Parent void show() { } ^ overridden method is final> 3. Statičnih metod ni mogoče preglasiti (preglasitev metode v primerjavi s skrivanjem metode):
Ko definirate statično metodo z enakim podpisom kot statična metoda v osnovnem razredu, je znana kot skrivanje metode . Naslednja tabela povzema, kaj se zgodi, ko definirate metodo z enakim podpisom kot metoda v nadrazredu.
| Metoda primerka nadrazreda | Statična metoda superrazreda | |
|---|---|---|
| Metoda primerka podrazreda | Preglasitve | Ustvari napako med prevajanjem |
| Statična metoda podrazreda | Ustvari napako med prevajanjem | Skriva |
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();> >}> }> |
>
>Izhod
razvrščanje z združevanjem
From parent static m1() From child non - static(instance) m2()>
4. Zasebnih metod ni mogoče preglasiti
Zasebne metode ni mogoče preglasiti, ker so povezani med časom prevajanja. Zato ne moremo niti preglasiti zasebnih metod v podrazredu. (Glejte to za podrobnosti).
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> >}> }> |
>
>Izhod
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. Preglasitvena metoda mora imeti isto vrnjeno vrsto (ali podvrsto)
Od Jave 5.0 naprej je mogoče imeti različne tipe vrnitve za preglasitveno metodo v podrejenem razredu, vendar mora biti tip vrnitve otroka podtip nadrejenega tipa vrnitve. Ta pojav je znan kot kovariantni povratni tip .
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();> >}> }> |
>
>Izhod
This is the method in SuperClass This is the method in SubClass>
6. Priklic preglasene metode iz podrazreda
Metodo nadrejenega razreda lahko pokličemo v metodi preglasitve z uporabo super ključna beseda .
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();> >}> }> |
c# vadnica
>
>Izhod
Parent's show() Child's show()>
Preglasitev in konstruktor
Konstruktorja ne moremo preglasiti, saj nadrejeni in podrejeni razred nikoli ne moreta imeti konstruktorja z enakim imenom (ime konstruktorja mora biti vedno enako imenu razreda).
Preglasitev in obravnava izjem
Spodaj sta dve pravili, ki ju je treba upoštevati pri preglasitvi metod, povezanih z obravnavanjem izjem.
Pravilo #1
Če preglasena metoda nadrazreda ne vrže izjeme, lahko preglasitvena metoda podrazreda vrže samo nepreverjena izjema , bo vrženje preverjene izjeme povzročilo napako med prevajanjem.
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'>);> >}> }> |
>
>
Izhod
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> Pravilo #2
Če metoda preglasitve nadrazreda vrže izjemo, lahko metoda preglasitve podrazreda vrže samo isto izjemo podrazreda. Vstavljanje izjem za starše Hierarhija izjem bo vodilo do napake v času prevajanja. Prav tako ni nobene težave, če preglasena metoda podrazreda ne vrže nobene izjeme.
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()'>);> >}> }> |
>
>
Izhod
error: m1() in Child4 cannot override m1() in Parent void m1() throws Exception ^ overridden method does not throw Exception>
Preglasna in abstraktna metoda
Abstraktne metode v vmesniku ali abstraktnem razredu so namenjene preglasitvi v izpeljanih konkretnih razredih, sicer bo med prevajanjem vržena napaka.
Metoda preglasitve in sinhroniziran/strictfp
Prisotnost modifikatorja synchronized/strictfp z metodo ne vpliva na pravila preglasitve, tj. možno je, da lahko metoda synchronized/strictfp preglasi nesinhronizirano/strictfp metodo in obratno.
Opomba:
- V C++ potrebujemo virtualna ključna beseda doseči prevlado oz Polimorfizem izvajalnega časa . V Javi so metode privzeto navidezne.
- Lahko imamo večnivojsko preglasitev metode.
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();> >}> }> |
>
>Izhod
GrandChild's show()>
Preglasitev metode proti preobremenitvi metode
1. Preobremenitev je približno ista metoda z različnimi podpisi. Preglasitev je približno enaka metoda in isti podpis, vendar različni razredi, povezani z dedovanjem.
2. Preobremenitev je primer polimorfizma v času prevajalnika, preglasitev pa primer izvajalnega časa polimorfizem .
Pogosta vprašanja o preglasitvi metode Java
Q1. Kaj je preglasitev metode?
Kot že rečeno, preglasene metode omogočajo podporo Javi polimorfizem med izvajanjem . Polimorfizem je bistvenega pomena za objektno usmerjeno programiranje iz enega razloga: omogoča splošnemu razredu, da določi metode, ki bodo skupne vsem njegovim izpeljankam, hkrati pa dovoljuje podrazredom, da definirajo specifično izvedbo nekaterih ali vseh teh metod. Preglasene metode so še en način, kako Java implementira vidik polimorfizma en vmesnik, več metod. Pošiljanje dinamične metode je eden najmočnejših mehanizmov, ki jih objektno usmerjeno načrtovanje prinaša pri ponovni uporabi in robustnosti kode. Možnost obstoja knjižnic kode za klicanje metod na primerkih novih razredov brez ponovnega prevajanja ob ohranjanju čistega abstraktnega vmesnika je zelo močno orodje. Preglasene metode nam omogočajo, da pokličemo metode katerega koli izpeljanega razreda, ne da bi sploh poznali vrsto izpeljanega predmeta razreda.
Q2. Kdaj uporabiti preglasitev metode? (z primerom)
Preglasitev in Dedovanje : Del ključa do uspešne uporabe polimorfizma je razumevanje, da nadrazredi in podrazredi tvorijo hierarhijo, ki se premika od manjše k večji specializaciji. Ob pravilni uporabi nadrazred zagotavlja vse elemente, ki jih podrazred lahko uporablja neposredno. Definira tudi tiste metode, ki jih mora izpeljani razred implementirati sam. To omogoča podrazredu prilagodljivost pri definiranju svojih metod, vendar še vedno uveljavlja dosleden vmesnik. Tako lahko nadrazred s kombiniranjem dedovanja s preglasenimi metodami definira splošno obliko metod, ki jih bodo uporabljali vsi njegovi podrazredi. Oglejmo si bolj praktičen primer, ki uporablja preglasitev metode. Razmislite o programski opremi za upravljanje zaposlenih za organizacijo, naj ima koda preprost osnovni razred Employee, razred pa ima metode, kot so raiseSalary(), transfer(), promote(), .. itd. Različne vrste zaposlenih, kot so vodja, inženir, ..etc imajo lahko svoje izvedbe metod, ki so prisotne v osnovnem razredu Employee. V naši popolni programski opremi moramo povsod posredovati le seznam zaposlenih in poklicati ustrezne metode, ne da bi sploh vedeli, za katero vrsto zaposlenega gre. Na primer, lahko preprosto zvišamo plače vsem zaposlenim s ponavljanjem po seznamu zaposlenih. Vsaka vrsta zaposlenih ima lahko svojo logiko v svojem razredu, zato nam ni treba skrbeti, ker če je raiseSalary() prisoten za določeno vrsto zaposlenih, bo klicana samo ta metoda.
testiranje delovanja
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);>>}>}>>>IzhodManager's salary : 30000 Clerk's salary : 20000>
Sorodni članek
- Dinamično pošiljanje metod ali polimorfizem izvajalnega okolja v Javi
- Preglasitev metode equals() razreda Object
- Preglasitev metode toString() razreda Object
- Preobremenitev v Javi
- Izhod programa Java | Niz 18 (preglasitev)