Używanie słowa kluczowego z dziedziczeniem w Javie

click fraud protection

Podczas gdy jeden z Java mocne strony to koncepcja dziedziczenia, w której jedna klasa może wywodzić się z innej, czasem pożądane jest, aby zapobiec dziedziczeniu przez inną klasę. Aby zapobiec dziedziczeniu, użyj słowa kluczowego „final” podczas tworzenia klasy.

Na przykład, jeśli klasa może być używana przez innych programistów, możesz chcieć zapobiec dziedziczeniu, jeśli jakiekolwiek utworzone podklasy mogą powodować problemy. Typowym przykładem jest Klasa strun. Jeśli chcielibyśmy utworzyć podklasę String:

klasa publiczna MyString rozszerza ciąg {
}

Wystąpiłby ten błąd:

 nie może dziedziczyć po końcowym pliku java.lang. Strunowy 

Projektanci klasy String zdali sobie sprawę, że nie jest to kandydat do dziedziczenia i zapobiegli jego przedłużeniu.

Dlaczego zapobiegać dziedziczeniu?

Główny powód, aby temu zapobiec dziedzictwo jest upewnienie się, że sposób, w jaki zachowuje się klasa, nie zostanie uszkodzony przez podklasę.

Załóżmy, że mamy konto klasy i podklasę, która je rozszerza, OverdraftAccount. Konto klasy ma metodę getBalance ():

instagram viewer
 publiczne podwójne getBalance ()

{

 zwróć to. równowaga;

 } 

W tym momencie naszej dyskusji podklasa OverdraftAccount nie zastąpiła tej metody.

(Uwaga: Aby przeprowadzić kolejną dyskusję przy użyciu tego konta i klas konta debetowego, zobacz, jak podklasę można traktować jako nadklasę).

Utwórzmy instancję dla każdej z kont i klas konta OverdraftAccount:

 Konta bobsAccount = nowe konto (10);

 bobsAccount.depositMoney (50);

 OverdraftAccount jimsAccount = nowy OverdraftAccount (15.05.500,0.05);

 jimsAccount.depositMoney (50);

 // utwórz tablicę obiektów konta

 // możemy dołączyć jimsAccount, ponieważ my 

 // chcę traktować to tylko jako obiekt konta

 Konto [] konta = {bobsAccount, jimsAccount};


 // dla każdego konta w tablicy wyświetl saldo

 dla (Konto a: konta)

 {

 System.out.printf („Saldo wynosi% .2f% n”, a.getBalance ());

 }

 Dane wyjściowe to:

 Saldo wynosi 60,00

 Saldo wynosi 65,05 

Tutaj wszystko wydaje się działać zgodnie z oczekiwaniami. Ale co, jeśli OverdraftAccount zastąpi metodę getBalance ()? Nic nie stoi na przeszkodzie, aby zrobić coś takiego:

 Konto OverdraftAccount klasy publicznej rozszerza konto {


 prywatny podwójny kredyt w rachunku bieżącym;

 prywatny podwójny kredyt w rachunku bieżącym;


 // reszta definicji klasy nie jest uwzględniona


 publiczne podwójne getBalance ()

 {

 zwrot 25,00;

 }

 } 

Jeśli powyższy przykładowy kod zostanie ponownie wykonany, dane wyjściowe będą się różnić, ponieważ zachowanie thegetBalance () w klasie OverdraftAccount jest wywoływane dla jimsAccount:

 Dane wyjściowe to:

 Saldo wynosi 60,00

 Saldo wynosi 25,00 

Niestety będzie to podklasa OverdraftAccount nigdy zapewnić prawidłowe saldo, ponieważ z powodu dziedziczenia uszkodziliśmy zachowanie klasy konta.

Jeśli projektujesz klasę do wykorzystania przez innych programistów, zawsze rozważaj implikacje wszelkich potencjalnych podklas. Z tego powodu nie można rozszerzyć klasy String. Jest niezwykle ważne, aby programiści wiedzieli, że kiedy tworzą obiekt String, zawsze zachowuje się jak String.

Jak zapobiegać dziedziczeniu

Aby zatrzymać rozszerzanie klasy, deklaracja klasy musi wyraźnie stwierdzać, że nie można jej odziedziczyć. Osiąga się to poprzez użycie słowa kluczowego „final”:

 Konto publicznej klasy końcowej {


 } 

Oznacza to, że klasa konta nie może być nadklasą, a klasa OverdraftAccount nie może już być jej podklasą.

Czasami możesz chcieć ograniczyć tylko niektóre zachowania nadklasy, aby uniknąć uszkodzenia przez podklasę. Na przykład OverdraftAccount nadal może być podklasą konta, ale należy uniemożliwić przesłanianie metody getBalance ().

W takim przypadku użyj słowa kluczowego „final” w deklaracji metody:

 Konto klasy publicznej {


 prywatny podwójny bilans;


 // reszta definicji klasy nie jest uwzględniona


 publiczne końcowe podwójne getBalance ()

 {

 zwróć to. równowaga;

 } 

 } 

Zauważ, że końcowe słowo kluczowe nie jest używane w definicji klasy. Można utworzyć podklasy konta, ale nie mogą one zastąpić metody getBalance (). Każdy kod wywołujący tę metodę może mieć pewność, że zadziała zgodnie z zamierzeniami oryginalnego programisty.

instagram story viewer