Forskellen mellem standardadgangsspecifikationen og beskyttet adgangsspecifikationen i java
Denne Java-tutorial kan være til noget for dig.
Modifier | Class | Package | Subclass | World
public | Y | Y | Y | Y
protected | Y | Y | Y | N
no modifier | Y | Y | N | N
private | Y | N | N | N
protected
specifier tillader adgang for alle underklasser af den pågældende klasse, uanset hvilken pakke de befinder sig i, såvel som til anden kode i den samme pakke. Standardspecifikationen tillader adgang med anden kode i den samme pakke, men ikke med kode, der er i underklasser, der ligger i forskellige pakker. Se Java-sprogspecifikation, afsnit 6.6.
EDIT:Efter anmodning fra Michael Schmeißer (så andre ikke behøver at læse kommentarerne igennem eller følge et link for at finde dette):alle medlemmer af grænseflader er implicit offentlige. Det er faktisk en kompileringsfejl at angive en hvilken som helst adgangsspecifikation for et interfacemedlem andet end public
(selvom ingen adgangsspecifikation overhovedet er standard for offentlig adgang). Her er det fulde sæt regler fra JLS for klassemedlemmer (se ovenstående link for reglerne for pakker, klasser og grænseflader på øverste niveau og arrays):
Et medlem (klasse, grænseflade, felt eller metode) af en reference (klasse, grænseflade eller array) type eller en konstruktør af en klassetype er kun tilgængelig, hvis typen er tilgængelig, og medlemmet eller konstruktøren er erklæret at tillade adgang:
-
Hvis medlemmet eller konstruktøren er erklæret offentlig, er adgang tilladt.
-
Alle medlemmer af grænseflader er implicit offentlige.
-
Ellers, hvis medlemmet eller konstruktøren er erklæret beskyttet, er adgang kun tilladt, når et af følgende er sandt:
-
Adgang til medlemmet eller konstruktøren sker fra pakken, der indeholder den klasse, hvori det beskyttede medlem eller konstruktør er erklæret.
-
Adgangen er korrekt som beskrevet i §6.6.2. (Denne klausul henviser til reglerne, der tillader afledte klasser at få adgang til beskyttede medlemmer af superklasser; §6.6.2 starter:"Et beskyttet medlem eller konstruktør af et objekt kan kun tilgås uden for pakken, hvori det er erklæret kun af kode, der er ansvarlig for implementeringen af det pågældende objekt." Det uddyber så.)
-
Ellers, hvis medlemmet eller konstruktøren er erklæret privat, er adgang kun tilladt, hvis og kun hvis det forekommer inden for kroppen af klassen på øverste niveau (§7.6), der omslutter medlemmets eller konstruktørens erklæring.
-
Ellers siger vi, at der er standardadgang, som kun er tilladt, når adgangen sker fra den pakke, som typen er deklareret i.
Beskyttet adgang specifier - der er to måder at få adgang til beskyttede data på
-
De beskyttede datamedlemmer, beskyttede metoder i en klasse vil være synlige for de andre klasser, hvis de ligger i samme pakke
-
Brug af Arv
betyder, at vi kan bruge de beskyttede data for den pågældende klasse ved at arve den klasse.
Standardadgangsspecifikation- Kun én måde at få adgang til standarddata
Standard begrænser kun adgangen til pakkeniveau, selv efter udvidelse af klassen med standarddatamedlemmer, vil vi ikke kunne få adgang.
Eksempel
For at kontrollere det for standard fjern beskyttet søgeord for int x i ProvideProtected vil der blive genereret en kompileringstidsfejl.
1. SuperClass
package nee.superclass;
public class ProvideProtected {
protected int x=800;
}
2.Subclass
package nee.subclass;
import nee.superclass.*;
public class AccessProtected extends ProvideProtected
{
public void accessProtected()
{
System.out.println(x);
}
public static void main(String[] args) {
AccessProtected obj=new AccessProtected();
obj.accessProtected();
}
}