Java 'beskyttet' adgangsmodifikator

1. Oversigt

I programmeringssproget Java kan felter, konstruktører, metoder og klasser markeres med adgangsmodifikatorer. I denne vejledning ser vi på beskyttet adgang.

2. Den beskyttet Nøgleord

Mens elementer erklæret som privat kan kun tilgås af den klasse, hvori de er erklæret, den beskyttet nøgleord giver adgang fra underklasser og medlemmer af samme pakke.

Ved hjælp af beskyttet nøgleord, vi træffer beslutninger om, hvilke metoder og felter der skal betragtes som internt i en pakke eller klassehierarki, og som er udsat for ekstern kode.

3. Erklæring beskyttet Felter, metoder og konstruktører

Lad os først oprette enklasse navngivet Første klasse indeholdende en beskyttet felt, metode og konstruktør:

offentlig klasse FirstClass {beskyttet strengnavn; beskyttet FirstClass (strengnavn) {this.name = navn; } beskyttet String getName () {return name; }}

Ved hjælp af dette eksempel ved hjælp af beskyttet nøgleord, vi har givet klasser adgang til disse felter i samme pakke som Første klasse og til underklasser af Første klasse.

4. Adgang beskyttet Felter, metoder og konstruktører

4.1 Fra samme pakke

Lad os nu se, hvordan vi kan få adgang beskyttet felter ved at oprette en ny GenericClass erklæret i samme pakke som Første klasse:

public class GenericClass {public static void main (String [] args) {FirstClass first = new FirstClass ("random name"); System.out.println ("FirstClass name is" + first.getName ()); first.name = "nyt navn"; }}

Da denne opkaldsklasse er i samme pakke som Første klasse, det er tilladt at se og interagere med alle de beskyttet felter, metoder og konstruktører.

4.2. Fra en anden pakke

Lad os nu prøve at interagere med disse felter fra en klasse, der er deklareret i en anden pakke fra Første klasse:

public class SecondGenericClass {public static void main (String [] args) {FirstClass first = new FirstClass ("random name"); System.out.println ("FirstClass name is" + first.getName ()); first.name = "nyt navn"; }}

Som vi kan se, vi får kompileringsfejl:

Konstruktøren FirstClass (String) er ikke synlig Metoden getName () fra typen FirstClass er ikke synlig Feltet FirstClass.name er ikke synlig

Det var præcis, hvad vi forventede ved at bruge beskyttet nøgleord. Dette er fordi SecondGenericClass er ikke i samme pakke som Første klasse og underklasserer det ikke.

4.3 Fra en underklasse

Lad os nu se, hvad der sker, når vi erklærer en klasse, der udvider sig Første klasse men erklæret i en anden pakke:

offentlig klasse SecondClass udvider FirstClass {public SecondClass (String name) {super (name); System.out.println ("SecondClass name is" + this.getName ()); this.name = "nyt navn"; }}

Som forventet kan vi få adgang til alle de beskyttede felter, metoder og konstruktører. Dette er fordi Anden klasse er en underklasse af Første klasse.

5. beskyttet Indre klasse

I de tidligere eksempler så vi beskyttet felter, metoder og konstruktører i aktion. Der er endnu en særlig sag - a beskyttet indre klasse.

Lad os skabe denne tomme indre klasse inde i vores Første klasse:

pakke com.baeldung.core.modifiers; offentlig klasse FirstClass {// ... beskyttet statisk klasse InnerClass {}}

Som vi kan se, er dette en statisk indre klasse og kan således konstrueres udefra en forekomst af Første klasse. Men som det er beskyttet, vi kan kun instantiere det fra kode i samme pakke som Første klasse.

5.1 Fra samme pakke

Lad os redigere vores for at teste dette GenericClass:

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

Som vi kan se, kan vi instantiere InnerClass uden problemer fordi GenericClass er i samme pakke som Første klasse.

5.2. Fra en anden pakke

Lad os prøve at instantiere en InnerClass fra vores SecondGenericClass som, som vi husker, er udenfor Første klasse' pakke:

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

Som forventet, vi får en kompileringsfejl:

Typen FirstClass.InnerClass er ikke synlig

5.3. Fra en underklasse

Lad os prøve at gøre det samme fra vores Anden klasse:

offentlig klasse SecondClass udvider FirstClass {public SecondClass (String name) {// ... FirstClass.InnerClass innerClass = new FirstClass.InnerClass (); }}

Vi forventede at øge vores InnerClass med lethed. Vi får dog også en kompileringsfejl her:

Konstruktøren FirstClass.InnerClass () er ikke synlig

Lad os se på vores InnerClass erklæring:

beskyttet statisk klasse InnerClass {}

Hovedårsagen til, at vi får denne fejl, er, at standardkonstruktøren af ​​en beskyttet klasse er implicit beskyttet. Ud over, Anden klasseer en underklasse af FirstClass, men er ikke en underklasse af InnerClass. Langt om længe, vi erklærede ogsåAnden klasse uden for Første klasse' pakke.

Af alle disse grunde Anden klasse kan ikke få adgang til beskyttetInnerClass konstruktør.

Hvis vi ville for at løse dette problem og tillade vores Anden klasse at instantiere en InnerClass objekt, vi kunne eksplicit erklære en offentlig konstruktør:

beskyttet statisk klasse InnerClass {public InnerClass () {}}

Ved at gøre dette får vi ikke længere en kompileringsfejl, og vi kan nu starte en InnerClass fra Anden klasse.

6. Konklusion

I denne hurtige vejledning diskuterede vi beskyttet adgangsmodifikator i Java. Med det kan vi sikre, at vi kun udsætter de krævede data og metoder for underklasser og klasser i samme pakke.

Som altid er eksempelkoden tilgængelig på GitHub.


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