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.