Java ‘zaštićeni’ Modifikator pristupa
1. Pregled
U programskom jeziku Java polja, konstruktori, metode i klase mogu se označiti modifikatorima pristupa. U ovom uputstvu ćemo pogledati zaštićen pristup.
2. The zaštićen Ključna riječ
Dok su elementi deklarirani kao privatni može pristupiti samo klasa u kojoj su deklarirani, zaštićen ključna riječ omogućuje pristup podklasama i članovima istog paketa.
Korištenjem zaštićen ključnu riječ, donosimo odluke o tome koje metode i polja treba smatrati unutarnjim dijelovima hijerarhije paketa ili klase i koji su izloženi vanjskom kodu.
3. Izjava zaštićen Polja, metode i konstruktori
Prvo, izradimo arazred imenovan Prvi razred koji sadrži a zaštićen polje, metoda i konstruktor:
javna klasa FirstClass {zaštićeni naziv niza; zaštićen FirstClass (ime niza) {this.name = name; } zaštićeni niz getName () {return ime; }}
U ovom primjeru, pomoću zaštićen ključnu riječ, odobrili smo pristup tim poljima klasama u istom paketu kao i Prvi razred i na podrazrede Prvi razred.
4. Pristup zaštićen Polja, metode i konstruktori
4.1 Iz istog paketa
Sada, da vidimo kako možemo pristupiti zaštićen polja stvaranjem novog GenericClass deklarirano u istom paketu kao Prvi razred:
javna klasa GenericClass {public static void main (String [] args) {FirstClass first = new FirstClass ("random name"); System.out.println ("FirstClass ime je" + first.getName ()); first.name = "novo ime"; }}
Kako je ova klasa pozivanja u istom paketu kao i Prvi razred, dopušteno je vidjeti i komunicirati sa svim zaštićen polja, metode i konstruktori.
4.2. Iz drugog paketa
Pokušajmo sada komunicirati s tim poljima iz klase koja je deklarirana u paketu različitom od Prvi razred:
javna klasa SecondGenericClass {javna statička void glavna (String [] args) {FirstClass first = novi FirstClass ("slučajno ime"); System.out.println ("FirstClass ime je" + first.getName ()); first.name = "novo ime"; }}
Kao što vidimo, dobivamo pogreške u kompilaciji:
Konstruktor FirstClass (String) nije vidljiv Metoda getName () iz tipa FirstClass nije vidljiva Polje FirstClass.name nije vidljivo
Upravo smo to očekivali koristeći zaštićen ključna riječ. Ovo je zbog SecondGenericClass nije u istom paketu kao Prvi razred i ne podrazvrstava ga.
4.3 Iz potklase
Pogledajmo sada što se događa kada izjavimo razred koji se proteže Prvi razred ali deklarirano u drugom paketu:
javna klasa SecondClass proširuje FirstClass {javni SecondClass (naziv niza) {super (ime); System.out.println ("Ime drugog razreda je" + this.getName ()); this.name = "novo ime"; }}
Kao što se očekivalo, možemo pristupiti svim zaštićenim poljima, metodama i konstruktorima. Ovo je zbog Drugi razred je potklasa od Prvi razred.
5. zaštićen Unutarnja klasa
U prethodnim smo primjerima vidjeli zaštićen polja, metode i konstruktori u akciji. Postoji još jedan određeni slučaj - a zaštićen unutarnja klasa.
Stvorimo ovu praznu unutarnju klasu u našoj Prvi razred:
paket com.baeldung.core.modifiers; javna klasa FirstClass {// ... zaštićena statička klasa InnerClass {}}
Kao što vidimo, ovo je statična unutarnja klasa i tako se može konstruirati izvan instance Prvi razred. Međutim, kakav jest zaštićen, možemo ga instancirati samo iz koda u istom paketu kao i Prvi razred.
5.1 Iz istog paketa
Da bismo to testirali, uredimo naš GenericClass:
javna klasa GenericClass {public static void main (String [] args) {// ... FirstClass.InnerClass innerClass = new FirstClass.InnerClass (); }}
Kao što vidimo, možemo instancirati InnerClass bez ikakvog problema jer GenericClass je u istom paketu kao i Prvi razred.
5.2. Iz drugog paketa
Pokušajmo instancirati InnerClass od našeg SecondGenericClass koja je, kao što se sjećamo, vani Prvi razred' paket:
javna klasa SecondGenericClass {javna statička void glavna (String [] args) {// ... FirstClass.InnerClass innerClass = new FirstClass.InnerClass (); }}
Očekivano, dobivamo pogrešku u kompilaciji:
Tip FirstClass.InnerClass nije vidljiv
5.3. Iz podklase
Pokušajmo učiniti isto od našeg Drugi razred:
javna klasa SecondClass proširuje FirstClass {public SecondClass (naziv niza) {// ... FirstClass.InnerClass innerClass = new FirstClass.InnerClass (); }}
Očekivali smo da ćemo instancirati naš InnerClass s lakoćom. Međutim, i ovdje dobivamo pogrešku u kompilaciji:
Konstruktor FirstClass.InnerClass () nije vidljiv
Pogledajmo naše InnerClass deklaracija:
zaštićena statička klasa InnerClass {}
Glavni razlog zašto dobivamo ovu pogrešku je taj zadani konstruktor a zaštićen klasa je implicitno zaštićen. U Dodatku, Drugi razredje podklasa FirstClass, ali nije podklasa InnerClass. Konačno, izjavili smo i miDrugi razred izvana Prvi razred' paket.
Iz svih ovih razloga, Drugi razred ne mogu pristupiti zaštićenInnerClass konstruktor.
Da smo htjeli riješiti ovo pitanje i dopustiti naš Drugi razred za instanciranje an InnerClass objekt, mogli bismo izričito proglasiti javnim konstruktorom:
zaštićena statička klasa InnerClass {public InnerClass () {}}
Čineći to, više ne dobivamo pogrešku pri kompilaciji, a sada možemo instancirati datoteku InnerClass iz Drugi razred.
6. Zaključak
U ovom smo brzom vodiču razgovarali o zaštićen modifikator pristupa u Javi. Pomoću nje možemo osigurati izlaganje samo potrebnih podataka i metoda podrazredima i klasama u istom paketu.
Kao i uvijek, primjer koda dostupan je na GitHub-u.