Java 'beskyttet' Access Modifier

1. Oversikt

På programmeringsspråket Java kan felt, konstruktører, metoder og klasser merkes med tilgangsmodifikatorer. I denne opplæringen vil vi se på beskyttet adgang.

2. Den beskyttet Nøkkelord

Mens elementer erklært som privat kan bare nås av klassen de er deklarert i, the beskyttet nøkkelord gir tilgang fra underklasser og medlemmer av samme pakke.

Ved å bruke beskyttet nøkkelord, vi tar avgjørelser om hvilke metoder og felt som skal betraktes som indre av en pakke eller klassehierarki, og som er utsatt for ekstern kode.

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

La oss først lage enklasse oppkalt Førsteklasses inneholder en beskyttet felt, metode og konstruktør:

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

Med dette eksemplet, ved å bruke beskyttet nøkkelord, vi har gitt tilgang til disse feltene til klasser i samme pakke som Førsteklasses og til underklasser av Førsteklasses.

4. Tilgang beskyttet Felt, metoder og konstruktører

4.1 Fra samme pakke

La oss nå se hvordan vi får tilgang beskyttet felt ved å opprette et nytt GenericClass erklært i samme pakke som Førsteklasses:

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 = "nytt navn"; }}

Ettersom denne ringeklassen er i samme pakke som Førsteklasses, det er lov å se og samhandle med alt beskyttet felt, metoder og konstruktører.

4.2. Fra en annen pakke

La oss nå prøve å samhandle med disse feltene fra en klasse deklarert i en annen pakke fra Førsteklasses:

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 = "nytt navn"; }}

Som vi kan se, vi får kompileringsfeil:

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

Det var akkurat det vi forventet ved å bruke beskyttet nøkkelord. Dette er fordi SecondGenericClass er ikke i samme pakke som Førsteklasses og underklasser den ikke.

4.3 Fra en underklasse

La oss nå se hva som skjer når vi erklærer en klasse som strekker seg Førsteklasses men erklært i en annen pakke:

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

Som forventet kan vi få tilgang til alle de beskyttede feltene, metodene og konstruktørene. Dette er fordi Andre klasse er en underklasse av Førsteklasses.

5. beskyttet Indre klasse

I de forrige eksemplene så vi beskyttet felt, metoder og konstruktører i aksjon. Det er et spesielt tilfelle - a beskyttet indre klasse.

La oss lage denne tomme indre klassen i vår Førsteklasses:

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

Som vi kan se, er dette en statisk indre klasse, og kan derfor konstrueres utenfra en forekomst av Førsteklasses. Imidlertid, som det er beskyttet, vi kan bare instantiere den fra kode i samme pakke som Førsteklasses.

5.1 Fra samme pakke

For å teste dette, la oss redigere vår GenericClass:

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

Som vi kan se, kan vi øyeblikkeliggjøre InnerClass uten problemer fordi GenericClass er i samme pakke som Førsteklasses.

5.2. Fra en annen pakke

La oss prøve å sette i gang en InnerClass fra vår SecondGenericClass som, som vi husker, er utenfor Førsteklasses' pakke:

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

Som forventet, vi får en kompileringsfeil:

Typen FirstClass.InnerClass er ikke synlig

5.3. Fra en underklasse

La oss prøve å gjøre det samme fra vår Andre klasse:

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

Vi forventet å sette i gang vår InnerClass enkelt. Vi får imidlertid en kompileringsfeil også her:

Konstruktøren FirstClass.InnerClass () er ikke synlig

La oss ta en titt på vår InnerClass erklæring:

beskyttet statisk klasse InnerClass {}

Hovedårsaken til at vi får denne feilen er at standardkonstruktøren til en beskyttet klasse er implisitt beskyttet. I tillegg, Andre klasseer en underklasse av FirstClass, men er ikke en underklasse av InnerClass. Endelig, vi erklærte ogsåAndre klasse utenfor Førsteklasses' pakke.

Av alle disse grunnene, Andre klasse får ikke tilgang til beskyttetInnerClass konstruktør.

Hvis vi ville for å løse dette problemet og la vår Andre klasse å instansiere en InnerClass gjenstand, vi kunne eksplisitt erklære en offentlig konstruktør:

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

Ved å gjøre dette får vi ikke lenger en kompileringsfeil, og vi kan nå starte en InnerClass fra Andre klasse.

6. Konklusjon

I denne raske opplæringen diskuterte vi beskyttet tilgangsmodifikator i Java. Med den kan vi sikre at vi bare utsetter de nødvendige dataene og metodene for underklasser og klasser i samme pakke.

Som alltid er eksempelkoden tilgjengelig på GitHub.


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