Java „chránený“ modifikátor prístupu

1. Prehľad

V programovacom jazyku Java môžu byť polia, konštruktory, metódy a triedy označené modifikátormi prístupu. V tomto návode sa pozrieme na chránené prístup.

2. The chránené Kľúčové slovo

Zatiaľ čo prvky deklarované ako súkromné je prístupný iba triede, v ktorej sú vyhlásené, chránené kľúčové slovo umožňuje prístup z podtried a členov rovnakého balíka.

Použitím chránené kľúčové slovo, rozhodujeme o tom, ktoré metódy a polia by sa mali považovať za interné prvky hierarchie balíkov alebo tried a ktoré sú vystavené vonkajšiemu kódu.

3. Deklarácia chránené Polia, metódy a konštruktory

Najskôr vytvorme apomenovaná trieda Prvá trieda obsahujúce a chránené pole, metóda a konštruktor:

verejná trieda FirstClass {chránený názov reťazca; chránená FirstClass (názov reťazca) {this.name = meno; } chránený reťazec getName () {návratové meno; }}

V tomto príklade pomocou chránené kľúčové slovo, udelili sme prístup k týmto poliam triedam v rovnakom balíku ako Prvá trieda a do podtried Prvá trieda.

4. Prístup chránené Polia, metódy a konštruktory

4.1 Z rovnakého balíka

Teraz sa pozrime, ako k nim máme prístup chránené polí vytvorením nového Generická trieda deklarované v rovnakom balíku ako Prvá trieda:

public class GenericClass {public static void main (String [] args) {FirstClass first = new FirstClass ("random name"); System.out.println ("Názov prvej triedy je" + first.getName ()); first.name = "nové meno"; }}

Pretože táto volajúca trieda je v rovnakom balíku ako Prvá trieda, je dovolené vidieť a komunikovať so všetkým chránené polia, metódy a konštruktory.

4.2. Z iného balíka

Pokúsme sa teraz interagovať s týmito poľami z triedy deklarovanej v inom balíku ako Prvá trieda:

public class SecondGenericClass {public static void main (String [] args) {FirstClass first = new FirstClass ("random name"); System.out.println ("Názov prvej triedy je" + first.getName ()); first.name = "nové meno"; }}

Ako vidíme, dostávame chyby kompilácie:

Konštruktor FirstClass (String) nie je viditeľný Metóda getName () z typu FirstClass nie je viditeľná Pole FirstClass.name nie je viditeľné

To je presne to, čo sme pomocou produktu chránené kľúčové slovo. To je preto, že Druhá generická trieda nie je v rovnakom balíku ako Prvá trieda a nepodtriedi to.

4.3 Z podtriedy

Pozrime sa teraz, čo sa stane, keď vyhlásime trieda rozširujúca Prvá trieda ale deklarované v inom balíku:

public class SecondClass extends FirstClass {public SecondClass (String name) {super (name); System.out.println ("Názov druhej triedy je" + this.getName ()); this.name = "nové meno"; }}

Podľa očakávania máme prístup ku všetkým chráneným poliam, metódam a konštruktorom. To je preto, že Druhá trieda je podtrieda Prvá trieda.

5. chránené Vnútorná trieda

V predchádzajúcich príkladoch sme videli chránené polia, metódy a konštruktory v akcii. Existuje ešte jeden konkrétny prípad - a chránené vnútorná trieda.

Vytvorme túto prázdnu vnútornú triedu vo vnútri našej Prvá trieda:

balíček com.baeldung.core.modifiers; verejná trieda FirstClass {// ... chránená statická trieda InnerClass {}}

Ako vidíme, jedná sa o statickú vnútornú triedu, ktorá sa dá zostrojiť zvonka inštancie Prvá trieda. Ako to však je chránené, môžeme ho vytvoriť z kódu iba v rovnakom balíku ako Prvá trieda.

5.1 Z rovnakého balíka

Aby sme to otestovali, upravme naše Generická trieda:

public class GenericClass {public static void main (String [] args) {// ... FirstClass.InnerClass innerClass = new FirstClass.InnerClass (); }}

Ako vidíme, môžeme vytvoriť inštanciu InnerClass bez akýchkoľvek problémov, pretože Generická trieda je v rovnakom balíku ako Prvá trieda.

5.2. Z iného balíka

Pokúsme sa vytvoriť inštanciu InnerClass z našej Druhá generická trieda ktorý, ako si pamätáme, je vonku Prvá trieda' balenie:

public class SecondGenericClass {public static void main (String [] args) {// ... FirstClass.InnerClass innerClass = new FirstClass.InnerClass (); }}

Podľa očakávania, dostaneme chybu kompilácie:

Typ FirstClass.InnerClass nie je viditeľný

5.3. Z podtriedy

Pokúsme sa urobiť to isté z našej Druhá trieda:

public class SecondClass extends FirstClass {public SecondClass (String name) {// ... FirstClass.InnerClass innerClass = new FirstClass.InnerClass (); }}

Očakávali sme, že budeme mať inštanciu InnerClass S ľahkosťou. Aj tu však dostávame chybu kompilácie:

Konštruktor FirstClass.InnerClass () nie je viditeľný

Poďme sa pozrieť na naše InnerClass vyhlásenie:

chránená statická trieda InnerClass {}

Hlavným dôvodom, prečo sa nám táto chyba zobrazuje, je ten predvolený konštruktor a chránené trieda je implicitne chránené. Navyše, Druhá triedaje podtriedou FirstClass, ale nie je podtriedou InnerClass. Nakoniec aj sme deklarovaliDruhá trieda vonku Prvá trieda' balíček.

Zo všetkých týchto dôvodov Druhá trieda nemá prístup k súboru chránenéInnerClass konštruktér.

Keby sme chceli vyriešiť tento problém a dovoľte našim Druhá trieda vytvoriť inštanciu InnerClass objekt, mohli by sme výslovne vyhlásiť verejného konštruktéra:

chránená statická trieda InnerClass {public InnerClass () {}}

Takto už nedostaneme chybu kompilácie a teraz môžeme vytvoriť inštanciu InnerClass od Druhá trieda.

6. Záver

V tomto rýchlom výučbe sme diskutovali o chránené modifikátor prístupu v Jave. Pomocou neho môžeme zabezpečiť vystavenie iba požadovaných údajov a metód podtriedam a triedam v rovnakom balíku.

Vzorový kód je ako vždy k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found