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.