Ceea ce înseamnă că într-adevăr java protejat

Am deja menționat pe scurt faptul că membrul unei clase care este marcat ca fiind protejate, deschis la accesul claselor derivate, dar este un tratament prea generală a subiectului. Mai precis, acesta este disponibil în

clasă și în cadrul pachetului „nativ“ (pentru informații despre pachete, a se vedea capitolul 13), un membru al unui semn protejat poate fi inversat prin referire la un obiect care este de același tip sau de tipuri de instrumente financiare derivate. Iată un exemplu care va ajuta să înțeleagă ce a fost spus.

Considerăm o clasă care implementează structura cozii de date (coada) de model și crearea unei liste de tehnici legate adaugă (adăugați următorul obiect în coada de așteptare) și îndepărtați (ștergeți obiectul din coadă). element rând - un obiect de clasa Vindem, care conține link-uri la următoarea intrare coada si obiectul curent.

Vindem următor privat;

Element obiect privat;

Celula publică (elementul Object)

Vindem publice (element de obiect, Vindem următoare)

Obiectul getElement publice ()

void setElement publice (element de obiect)

Vindem getNext publice ()

void setNext publice (celula următoare)

public class SingleLinkedQueue

Vindem cap de protejat; // „cap“ coadă

Vindem coada protejate; // „coada“ coada de așteptare

public void add (Object element)

Obiect de eliminare publice ()

Link-uri ce indică spre „cap“ și „coada“ a cozii, marcat ca fiind protejate, astfel încât extinderea clasei vă permite să manipuleze elementele listei direct, eliminând necesitatea de a gestiona metodele de a adăuga și Remove, care este asociat cu costuri suplimentare care decurg din

necesitatea de a efectua unele operații suplimentare de ambalare și elemente despachetarea.

Unele grup de dezvoltatori necesare coadă de prioritate, în care elementele sunt stocate în conformitate cu criterii specifice, și nu doar adăugat la sfârșitul cozii de așteptare. Prin urmare, a declarat clasă și coadă prioritară este situată într-un pachet diferit; clasă moștenește SingleListQueue și-a anulat metoda de adăugare, care permite să plaseze noul element în locul potrivit la coada. Într-o variantă de realizare a metodei adăuga, aparține unei clase de coadă prioritară, cu condiția tratament la cap și coadă Quatnities câmpuri, moștenită de la clasa SingleListQueue - codul este într-o clasă derivată, astfel încât accesul membrilor protejate permis. Toate acestea sunt destul de normal și previzibil.

îmbinare public void (q coadă prioritară)

Vindem primul = q.head;

Să presupunem că echipa noastră creativă în cercetările sale a mers mai departe - ea a luat un mijloc de a realiza o fuziune de coadă singleLinkQueue de clasă cu coadă de tip coadă prioritară. Prin urmare, metoda „float“ este supraîncărcat de îmbinare, care ar putea fi prezentate pe scurt după cum urmează:

îmbinare public void (q singleLinkQueue)

Vindem primul = q.head;

Acest cod nu va fi compilat.

Aici sunt motivele pentru care cauzează restricții luate în considerare. Fiecare clasă derivată moștenește dintr-un contract de clasă de bază și se extinde ultimul sau: în alt mod. Să presupunem că una din clasele derivate, punerea în aplicare a propriului său de contract, în nici un fel limitează sfera de aplicare a valorilor admise câmpurilor moștenite dintr-o clasă de bază protejată. Dacă o altă pro a clasei de apă din aceeași clasă de bază poate avea acces la elementul de rgotested obiecte în primul rând, el ar fi câștigat posibilitatea și manipula conținutul lor în mod direct, nimic să „știe“ despre restricțiile impuse și riscă să rupă contractul primul derivat al clasei, și un astfel de curs , nu ar trebui să fie permisă.

Membrii desemnate ca fiind protejate și STATIS în același timp, deschis la indentare, în orice clasă extinsă. În cazul în care capul de câmp clasa SingleListQueue a fost echipat cu un STATIS modificator, orice metodă (fie ele statice sau nu) din clasa ar avea dreptul de a face apel la cap. Este foarte posibil, deoarece clasa derivată nu este în măsură să acționeze în partea din contract clasei de bază, care se referă la membrii statice și pot ascunde doar, dar nu pentru a le trece peste, și, prin urmare, riscul de încălcare a contractului de către o altă clasă exclusă în totalitate.

membrii clasei indicate protejate modificator, și accesibil din orice cod din interiorul ambalajului de care aparține clasei. În cazul în care clasele de cozi discutate mai sus au fost plasate într-un singur pachet, ar avea drepturi reciproce de acces la domeniile de cap și coadă - și orice membri protejați ai altor tipuri care sunt definite în același pachet. Clasele care aparțin aceluiași pachet sunt „încredere“ relație și nu încalcă contracte reciproc (pentru mai multe informații despre acest lucru, a se vedea capitolul 13). În cazul în care modificatorii de acces enumerate în această ordine: acces privat, la nivel de pachet, protejate, și publis - atunci fiecare creșteri ulterioare, oportunitățile de acces la membrii relevanți ai clasei.