Få adgang til modifikatorer i Java

1. Oversigt

I denne vejledning går vi over adgangsmodifikatorer i Java, som bruges til at indstille adgangsniveauet til klasser, variabler, metoder og konstruktører.

Kort sagt, der er fire adgangsmodifikatorer:offentlig, privat, beskyttet og Standard (intet nøgleord).

Før vi begynder, skal vi bemærke, at en klasse på øverste niveau kan bruge offentlig eller Standard kun adgangsmodifikatorer. På medlemsniveau kan vi bruge alle fire.

2. Standard

Når vi ikke bruger noget nøgleord eksplicit, indstiller Java en Standard adgang til en given klasse, metode eller ejendom. Standardadgangsmodifikatoren kaldes også pakke-privat, hvilket betyder at alle medlemmer er synlige inden for den samme pakke men er ikke tilgængelige fra andre pakker:

pakke com.baeldung.accessmodifiers; offentlig klasse SuperPublic {statisk ugyldig defaultMethod () {...}}

defaultMethod () er tilgængelig i en anden klasse af samme pakke:

pakke com.baeldung.accessmodifiers; offentlig klasse Offentlig {offentlig Offentlig () {SuperPublic.defaultMethod (); // Fås i samme pakke. }}

Det er dog ikke tilgængeligt i andre pakker.

3. Offentlig

Hvis vi tilføjer offentlig nøgleord til en klasse, metode eller ejendom derefter vi gør det tilgængeligt for hele verden, dvs. alle andre klasser i alle pakker vil kunne bruge det. Dette er den mindst begrænsende adgangsmodifikator:

pakke com.baeldung.accessmodifiers; offentlig klasse SuperPublic {offentlig statisk ugyldig publicMethod () {...}}

publicMethod () fås i en anden pakke:

pakke com.baeldung.accessmodifiers.another; import com.baeldung.accessmodifiers.SuperPublic; offentlig klasse AnotherPublic {public AnotherPublic () {SuperPublic.publicMethod (); // Fås overalt. Lad os bemærke en anden pakke. }}

For flere detaljer om, hvordan offentlig nøgleord opfører sig, når det anvendes til en klasse, grænseflade, indlejret offentlig klasse eller grænseflade og metode, se den dedikerede artikel.

4. Privat

Enhver metode, ejendom eller konstruktør med privat nøgleord er kun tilgængelig fra samme klasse. Dette er den mest begrænsende adgangsmodifikator og er kernen i begrebet indkapsling. Alle data vil være skjult for omverdenen:

pakke com.baeldung.accessmodifiers; offentlig klasse SuperPublic {statisk privat ugyldig privateMethod () {...} privat ugyldiggjort andenPrivatMetode () {privatMetode (); // kun tilgængelig i samme klasse. }}

Denne mere detaljerede artikel viser, hvordan privat nøgleord opfører sig, når det anvendes på et felt, en konstruktør, en metode og en indre klasse.

5. Beskyttet

Mellem offentlig og privat adgangsniveauer, der er beskyttet adgangsmodifikator.

Hvis vi erklærer en metode, ejendom eller konstruktør med beskyttet nøgleord, vi kan få adgang til medlemmet fra samme pakke (som med pakke-privat adgangsniveau) og derudover fra alle underklasser i sin klasse, selvom de ligger i andre pakker:

pakke com.baeldung.accessmodifiers; offentlig klasse SuperPublic {statisk beskyttet ugyldig beskyttetMetode () {...}}

protectedMethod () fås i underklasser (uanset pakke):

pakke com.baeldung.accessmodifiers.another; import com.baeldung.accessmodifiers.SuperPublic; offentlig klasse AnotherSubClass udvider SuperPublic {public AnotherSubClass () {SuperPublic.protectedMethod (); // Fås i underklasse. Lad os bemærke en anden pakke. }}

Den dedikerede artikel beskriver mere om nøgleordet, når det bruges i et felt, metode, konstruktør, indre klasse og tilgængeligheden i den samme pakke eller en anden pakke.

6. Sammenligning

Tabellen nedenfor opsummerer de tilgængelige adgangsmodifikatorer. Vi kan se, at en klasse, uanset de anvendte adgangsmodifikatorer, altid har adgang til sine medlemmer:

ModifikatorKlassePakkeUnderklasseVerden
offentlig
YYYY
beskyttet
YYYN
Standard
YYNN
privat
YNNN

7. Konklusion

I denne korte artikel gik vi over adgangsmodifikatorer i Java.

Det er god praksis at bruge et så begrænset adgangsniveau som muligt for et givet medlem for at forhindre misbrug. Vi skal altid bruge privat adgangsmodifikator, medmindre der er en god grund til ikke at.

Offentlig adgangsniveau bør kun bruges, hvis et medlem er en del af en API.

Som altid er kodeeksemplerne tilgængelige på Github.