Java >> Java tutorial >  >> Tag >> protected

Java :Beskyttet adgangsbegrænsning for underklasse på superklasseobjekt

Beskyttede medlemmer kan kun tilgås uden for den samme pakke, hvis det er via arv - dvs. inden for hierarkiet.

Så når du opretter en anden forekomst af A fra en anden pakke, er det ikke et arveforhold, og det mislykkes derfor.

Som altid er dette dækket af JLS, 6.6.2:

Et beskyttet medlem eller konstruktør af et objekt kan kun tilgås uden for pakken, hvori det er erklæret, kun ved hjælp af kode, der er ansvarlig for implementeringen af ​​det pågældende objekt.


Faktisk behøver du ikke to niveauer af arv, og koden nedenfor ville føre til samme adfærd:

public class B extends A{
     public void accessField() {
        A ancient = new A();
        ancient.a = 2;  //A - That wouldn't work.

        a = 2;   //B - That works.
    }
}

Grunden til, at a = 2 fungerer er JLS 6.2.2.1:

Lad C være den klasse, hvor et beskyttet medlem erklæres. Adgang er kun tilladt inden for kroppen af ​​en underklasse S af C.

Bemærk, at der ikke står direkte underklasse, men kun underklasse. Så a = 2 fungerer inden for B klasse eller C klasse.

På den anden side, ancient.a = 2; er dækket af det næste punkt i samme afsnit:

Hvis adgangen er af et kvalificeret navn Q.Id, hvor Q er et ExpressionName, så er adgangen tilladt, hvis og kun hvis typen af ​​udtrykket Q er S eller en underklasse af S.

I dit tilfælde Q.Id er ancient.a => det ville kun være tilgængeligt, hvis typen ancient var B eller en underklasse af B . Så for eksempel ville dette kompilere:

public class B extends A{
     public void accessField() {
        C ancient = new C();
        ancient.a = 2;  //A - That wouldn't work.
     }
}

Java tag