Java ‘védett’ Access Modifier

1. Áttekintés

A Java programozási nyelvben a mezőket, a konstruktorokat, a módszereket és az osztályokat hozzáférés-módosítókkal lehet megjelölni. Ebben az oktatóanyagban megnézzük védett hozzáférés.

2. A védett Kulcsszó

Míg az elemek deklaráltak magán csak az az osztály férhet hozzá, amelyben deklarálták védett kulcsszó lehetővé teszi az alosztályok és ugyanazon csomag tagjai hozzáférését.

A védett kulcsszó, döntéseket hozunk arról, hogy mely módszereket és mezőket kell egy csomag vagy osztály hierarchia belső részének tekinteni, és melyeket tesszük ki külső kódnak.

3. Nyilatkozat védett Mezők, módszerek és kivitelezők

Először hozzunk létre egyosztály nevű Első osztály tartalmazó a védett mező, módszer és kivitelező:

public class FirstClass {védett karakterlánc neve; védett FirstClass (karakterlánc neve) {this.name = név; } védett karakterlánc getName () {return name; }}

Ezzel a példával a védett kulcsszóval, hozzáférést biztosítottunk ezekhez a mezőkhöz az ugyanazon csomagban lévő osztályoknak Első osztály és az alosztályaiba Első osztály.

4. Hozzáférés védett Mezők, módszerek és kivitelezők

4.1 Ugyanabból a csomagból

Most nézzük meg, hogyan érhetjük el védett mezők létrehozásával egy új GenericClass deklarált ugyanabban a csomagban, mint Első osztály:

public class GenericClass {public static void main (String [] args) {FirstClass first = new FirstClass ("random name"); System.out.println ("Az FirstClass neve" + first.getName ()); first.name = "új név"; }}

Mivel ez a hívó osztály ugyanabban a csomagban van, mint a Első osztály, megengedett, hogy láthassa az összes védett mezők, módszerek és konstruktorok.

4.2. Más csomagból

Most próbáljuk meg interakcióba lépni ezekkel a mezőkkel egy olyan osztályból, amely egy másik csomagban van deklarálva Első osztály:

public class SecondGenericClass {public static void main (String [] args) {FirstClass first = new FirstClass ("random name"); System.out.println ("Az FirstClass neve" + first.getName ()); first.name = "új név"; }}

Ahogy látjuk, összeállítási hibákat kapunk:

A FirstClass (String) konstruktor nem látható. A getName () metódus a FirstClass típustól nem látható A FirstClass.name mező nem látható

Pontosan erre számítottunk a védett kulcsszó. Ez azért van, mert SecondGenericClass nem egy csomagban van Első osztály és nem osztja alá.

4.3 Alosztályból

Most nézzük meg, mi történik, amikor kijelentjük egy osztály kiterjesztése Első osztály de más csomagban nyilatkozott:

public class SecondClass kiterjeszti FirstClass {public SecondClass (karakterlánc neve) {super (név); System.out.println ("A SecondClass neve" + this.getName ()); this.name = "új név"; }}

A várakozásoknak megfelelően elérhetjük az összes védett mezőt, módszert és kivitelezőt. Ez azért van, mert Másodosztály alosztálya Első osztály.

5. védett Belső osztály

Az előző példákban láttuk védett mezők, módszerek és konstruktorok. Van még egy konkrét eset - a védett belső osztály.

Hozzuk létre ezt az üres belső osztályt a miénkben Első osztály:

com.baeldung.core.modifiers csomag; public class FirstClass {// ... védett statikus osztály InnerClass {}}

Amint láthatjuk, ez egy statikus belső osztály, és így felépíthető a Első osztály. Ahogy azonban van védett, csak a vele azonos csomagban lévő kódból tudjuk példányosítani Első osztály.

5.1 Ugyanabból a csomagból

Ennek teszteléséhez szerkesszük a mi GenericClass:

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

Mint láthatjuk, példányosíthatjuk a InnerClass minden gond nélkül, mert GenericClass ugyanabban a csomagban van, mint Első osztály.

5.2. Más csomagból

Próbáljunk meg példányosítani egy InnerClass tőlünk SecondGenericClass ami emlékezetünk szerint kívül van Első osztály' csomag:

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

A várakozásoknak megfelelően összeállítási hibát kapunk:

A FirstClass.InnerClass típus nem látható

5.3. Alosztályból

Próbáljuk megtenni ugyanezt a mi Másodosztály:

public class SecondClass kiterjeszti FirstClass {public SecondClass (karakterlánc neve) {// ... FirstClass.InnerClass internalClass = új FirstClass.InnerClass (); }}

Arra számítottunk, hogy példányosítjuk InnerClass könnyedén. Azonban itt is fordítási hibát kapunk:

A FirstClass.InnerClass () konstruktor nem látható

Vessünk egy pillantást a mi InnerClass nyilatkozat:

védett statikus osztályú InnerClass {}

A hiba oka elsősorban az, hogy az alapértelmezett konstruktora védett osztály hallgatólagosan védett. Továbbá, Másodosztálya FirstClass alkategóriája, de nem a InnerClass. Végül, mi is kijelentettükMásodosztály kívül Első osztály' csomag.

Mindezen okokból Másodosztály nem fér hozzá a védettInnerClass konstruktőr.

Ha akarnánk hogy megoldja ezt a kérdést és megengedi a mi Másodosztály hogy példányosítson egy InnerClass tárgy, kimondhatnánk, hogy nyilvános kivitelező:

védett statikus osztály InnerClass {public InnerClass () {}}

Ezzel már nem kapunk fordítási hibát, és most azonnal példányosíthatunk egy InnerClass tól től Másodosztály.

6. Következtetés

Ebben a gyors bemutatóban megvitattuk a védett hozzáférés módosító Java-ban. Ezzel biztosíthatjuk, hogy csak a szükséges adatok és módszerek legyenek kitéve ugyanabban a csomagban lévő alosztályoknak és osztályoknak.

Mint mindig, a példa kód elérhető a GitHubon.