logo

Ignorēšana Java

Java versijā Overriding ir līdzeklis, kas ļauj apakšklasei vai pakārtotajai klasei nodrošināt konkrētu metodes ieviešanu, ko jau nodrošina kāda no tās virsklasēm vai vecākklasēm. Ja metodei apakšklasē ir tāds pats nosaukums, tie paši parametri vai paraksts un tāds pats atgriešanas veids (vai apakštips) kā metodei tās virsklasē, tad apakšklasē esošā metode tiek uzskatīta par tādu. ignorēt metode superklasē.

Metodes ignorēšana ir viens no veidiem, kā Java panāk Darbības laika polimorfisms . Izpildītās metodes versiju noteiks objekts, kas tiek izmantots tās izsaukšanai. Ja metodes izsaukšanai tiek izmantots vecākklases objekts, tad tiks izpildīta vecākklasē esošā versija, bet, ja metodes izsaukšanai tiek izmantots apakšklases objekts, tad tiks izpildīta versija bērnklasē. Citiem vārdiem sakot, tas ir objekta veids, uz kuru attiecas atsauce (nevis atsauces mainīgā veids), kas nosaka, kura ignorētās metodes versija tiks izpildīta.



Metodes ignorēšanas piemērs Java

Tālāk ir norādīta Java metodes ignorēšanas ieviešana:

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

>

>

Izvade

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

Java metodes ignorēšanas noteikumi

1. Ignorēšana un piekļuves pārveidotāji

The piekļuves modifikators Ignorējošā metode var atļaut lielāku, bet ne mazāku piekļuvi nekā ignorētā metode. Piemēram, aizsargātas instances metodi virsklasē var padarīt publisku, bet ne privātu apakšklasē. To darot, tiks parādīta kompilēšanas laika kļūda.

Java




pārvēršot virkni par int
// 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();> >}> }>

>

>

Izvade

From parent m2() From child m2()>

2. Pēdējās metodes nevar ignorēt

Ja nevēlamies, lai kāda metode tiktu ignorēta, mēs to deklarējam kā galīgais . Lūdzu apskati Fināla izmantošana ar mantojumu .

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

>

>

Izvade

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

3. Statiskās metodes nevar ignorēt (metodes ignorēšana pret metodes slēpšanu):

Ja pamatklasē definējat statisku metodi ar tādu pašu parakstu kā statiskajai metodei, to sauc par slēpšanās metode . Nākamajā tabulā ir apkopots, kas notiek, ja definējat metodi ar tādu pašu parakstu kā metodi superklasē.

Superklases gadījumu metode Superklases statiskā metode
Apakšklases gadījumu metode Ignorē Ģenerē kompilēšanas laika kļūdu
Apakšklases statiskā metode Ģenerē kompilēšanas laika kļūdu Slēpjas

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

>

>

Izvade

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

4. Privātās metodes nevar ignorēt

Privātas metodes nevar ignorēt, jo tie ir saistīti kompilēšanas laikā. Tāpēc mēs pat nevaram ignorēt privātās metodes apakšklasē. (Skat šis sīkākai informācijai).

Java




ķēde uz priekšu

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

>

>

Izvade

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. Ignorējošajai metodei ir jābūt tādam pašam atgriešanas veidam (vai apakštipam).

Sākot ar Java 5.0, var būt dažādi atgriešanas veidi bērnklasē dominējošai metodei, taču bērna atgriešanas veidam ir jābūt vecāka atgriešanas veida apakštipam. Šī parādība ir pazīstama kā kovariants atgriešanās veids .

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

>

>

Izvade

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

6. Ignorētās metodes izsaukšana no apakšklases

Mēs varam izsaukt vecākklases metodi, izmantojot galveno metodi, izmantojot super atslēgvārds .

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

datoru organizācija un arhitektūra

>

>

Izvade

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

Virzīšana un konstruktors

Mēs nevaram ignorēt konstruktoru, jo vecākajai un pakārtotajai klasei nekad nevar būt konstruktors ar tādu pašu nosaukumu (konstruktora nosaukumam vienmēr ir jābūt tādam pašam kā klases nosaukumam).

Ignorēšana un izņēmumu apstrāde

Tālāk ir norādīti divi noteikumi, kas jāņem vērā, ignorējot metodes, kas saistītas ar izņēmumu apstrādi.

Noteikums #1

Ja virsklases ignorēšanas metode neizraisa izņēmumu, apakšklases ignorēšanas metode var mest tikai neatzīmēts izņēmums , izmetot pārbaudītu izņēmumu, radīsies kompilēšanas laika kļūda.

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

>

>

Izvade

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>

Noteikums #2

Ja virsklases ignorēšanas metode rada izņēmumu, apakšklases ignorēšanas metode var radīt tikai to pašu apakšklases izņēmumu. Mešana vecāku izņēmumiem Izņēmumu hierarhija radīs kompilēšanas laika kļūdu. Tāpat nav problēmu, ja apakšklases ignorētā metode nerada nekādu izņēmumu.

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

>

mākslīgais neironu tīkls
>

Izvade

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

Virzošā un abstraktā metode

Abstraktās metodes interfeisā vai abstraktajā klasē ir paredzēts ignorēt atvasinātās konkrētās klasēs, pretējā gadījumā tiks parādīta kompilēšanas laika kļūda.

Ignorēšanas un sinhronizētā/strictfp metode

Sinhronizēta/strictfp modifikatora klātbūtne ar metodi neietekmē ignorēšanas noteikumus, t.i., iespējams, ka sinhronizētā/strictfp metode var ignorēt nesinhronizēto/strictfp metodi un otrādi.

Piezīme:

  1. C++ valodā mums ir nepieciešams virtuālais atslēgvārds lai panāktu virsroku vai Darbības laika polimorfisms . Programmā Java metodes pēc noklusējuma ir virtuālas.
  2. Mums var būt daudzlīmeņu metodes ignorēšana.

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

>

>

Izvade

GrandChild's show()>

Metodes ignorēšana pret metodes pārslodzi

1. Pārslodze ir aptuveni viena un tā pati metode ar dažādiem parakstiem. Ignorēšana ir aptuveni viena un tā pati metode un viens un tas pats paraksts, bet dažādas klases, kas savienotas ar mantojuma palīdzību.

2. Pārslodze ir kompilatora laika polimorfisma piemērs un ignorēšana ir izpildlaika piemērs. polimorfisms .

Bieži uzdotie jautājumi par Java metodes ignorēšanu

Q1. Kas ir metodes ignorēšana?

Kā minēts iepriekš, ignorētas metodes ļauj Java atbalstīt izpildes laika polimorfisms . Polimorfisms ir būtisks objektorientētajai programmēšanai viena iemesla dēļ: tas ļauj vispārīgai klasei norādīt metodes, kas būs kopīgas visiem tās atvasinājumiem, vienlaikus ļaujot apakšklasēm definēt dažu vai visu šo metožu konkrētu ieviešanu. Ignorētās metodes ir vēl viens veids, kā Java īsteno vienu interfeisa, vairāku metožu polimorfisma aspektu. Dinamiskās metodes nosūtīšana ir viens no jaudīgākajiem mehānismiem, ko objektorientētais dizains nodrošina koda atkārtotai izmantošanai un robustumam. Iespēja pastāvēt kodu bibliotēkas, lai izsauktu metodes jaunu klašu gadījumos bez pārkompilēšanas, vienlaikus saglabājot tīru abstraktu interfeisu, ir ļoti spēcīgs rīks. Ignorētās metodes ļauj izsaukt jebkuras atvasinātās klases metodes, pat nezinot atvasinātās klases objekta veidu.

Q2. Kad piemērot Metodes ignorēšanu? (ar piemēru)

Pārsvarā un Mantojums : Daļa no atslēgas veiksmīgai polimorfisma pielietošanai ir izpratne par to, ka virsklases un apakšklases veido hierarhiju, kas virzās no mazākas uz lielāku specializāciju. Pareizi lietojot, virsklase nodrošina visus elementus, kurus apakšklase var izmantot tieši. Tas arī nosaka tās metodes, kuras atvasinātajai klasei ir jāīsteno vienai. Tas ļauj apakšklasei elastīgi definēt savas metodes, taču joprojām nodrošina konsekventu saskarni. Tādējādi, apvienojot pārmantošanu ar ignorētajām metodēm, virsklase var definēt to metožu vispārējo formu, kuras izmantos visas tās apakšklases. Apskatīsim praktiskāku piemēru, kas izmanto metodes ignorēšanu. Apsveriet darbinieku pārvaldības programmatūru organizācijai, lai kodā būtu vienkārša pamatklase Darbinieks, un klasē ir tādas metodes kā paaugstināt algu(), transfer(), veicināt(), .. utt. Dažāda veida darbinieki, piemēram, vadītājs, inženieris, ..etc var būt to metožu implementācijas, kas atrodas bāzes klasē Employee. Mūsu pilnīgajā programmatūrā mums vienkārši visur ir jānodod darbinieku saraksts un jāizsauc atbilstošas ​​metodes, pat nezinot darbinieka veidu. Piemēram, mēs varam viegli paaugstināt visu darbinieku algu, atkārtojot darbinieku sarakstu. Katram darbinieka veidam var būt sava loģika savā klasē, mums nav jāuztraucas, jo, ja noteiktam darbinieka veidam ir klāt RaiseSalary(), tiks izsaukta tikai šī metode.

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

>

>

Izvade

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

Saistīts raksts

  • Dinamiskās metodes nosūtīšana vai izpildlaika polimorfisms Java
  • Object klases metodes ignorēšana equals()
  • Object klases metodes toString() ignorēšana
  • Pārslodze Java
  • Java programmas izvade | 18. kopa (ievērojot)