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

Hvorfor kan jeg ikke få adgang til beskyttet java-metode, selv om jeg har udvidet klassen?

(EDIT:theycallmemortys svar giver de praktiske råd til at undgå dette problem i dit tilfælde. Dette svar giver grundene til, hvorfor du skal følge det råd, dvs. hvorfor sproget er blevet designet på den måde.)

Du kan kun få adgang til et beskyttet medlem af et andet objekt, som er af samme type som adgangskoden (eller en underklasse) - selvom medlemmet er erklæret i en supertype.

Fra Java-sprogspecifikationen, afsnit 6.6.2:

Lad C være den klasse, hvori et beskyttet medlem m er erklæret. Adgang er kun tilladt inden for kroppen af ​​underklasse S af C. Hvis Iddennoterer et forekomstfelt eller en forekomstmetode, så:

  • 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.
  • Hvis adgangen er af et feltadgangsudtryk E.Id, hvor E er et Primært udtryk, eller ved en metodeinvokationsudtryk E.Id(. . .), hvor E er et Primært udtryk, så er adgangen tilladt, hvis og kun hvis typen af ​​Eis S eller en underklasse af S.

Dette er for at give en type adgang til medlemmer, der er relevante for dens eget arvetræ, uden at besejre indkapsling af andre klasser. Antag for eksempel, at vi har:

     A
    / \
   B   Other
  /
 C

og A erklærede et beskyttet medlem x . Uden reglen fungerer, som den gør, kan du få en rund indkapsling ved at sætte et medlem i Other :

public int getX(A a)
{
    return a.x;
}

og bare kalder den passering i en instans af B eller C - medlemmet ville effektivt blive offentligt, fordi man altid kunne omgå det ved at introducere en anden klasse... ikke en god idé. Med den nuværende regel skal du underklasse B eller C - hvilket du måske ikke er i stand til i første omgang.


Ved at gøre dette:

MidiSynth synth = new MidiSynth();
sequence = synth.scoreToSeq(score); 

Du udnytter faktisk ikke det faktum, at du har udvidet MidiSynth-klassen.

Hvis du skulle prøve

this.scoreToSec(score);

Så vil du opdage, at du har adgang til den beskyttede funktion.


Java tag