Der Zugriff Auf Protected Variablen Einer Instanz Einer Klasse, Die Erweitert Die Abstrakte Klasse?
Ich habe eine abstrakte Klasse namens MyAction, die einen geschützten enum-variable. Die Klasse ist wie folgt definiert:
package mypackage;
public abstract class MyAction {
public enum ActionId {
ACTION1, ACTION2;
}
protected ActionId actionId;
//constructor
public MyAction(ActionId actionId) {
this.actionId = actionId;
}
public ActionId getActionId() {
return actionId;
}
...
...
}
Erstellte ich eine bestimmte Aktion, MyAction1, dass extends MyAction:
package mypackage;
public class MyAction1 extends MyAction {
public MyAction1() {
super(ActionId.ACTION1);
}
...
...
}
Ich habe eine singleton-utility-Klasse (im gleichen Paket), die erstellt eine Instanz von MyAction1 und speichert Sie in eine HashMap:
package mypackage;
public class MyActionFactory {
private static MyActionFactory theInstance;
private HashMap<ActionId, MyAction> actions;
private MyActionFactory() {
actions = new HashMap<ActionId, MyAction>();
MyAction1 myAction1 = new MyAction1();
actions.put(myAction1.actionId, myAction1); //able to access protected variable actionId
}
public static VsActionFactory getInstance() {
if (theInstance == null)
theInstance = new VsActionFactory();
return theInstance;
}
...
...
}
Beachten Sie, dass in der Methode Aktionen.put(myAction1.actionId, myAction1) ich bin in der Lage, den Zugriff auf die geschützten member actionId.
Warum ist es, dass ich Zugriff auf die protected-member actionId (enthalten in der base-Klasse MyAction) der Instanz von MyAction1? Ich dachte, protected-member wurden nur Unterklassen.
Muss es etwas zu tun mit MyActionFactory in der gleichen Paket wie die anderen?
- Protected-Elemente sind zugreifbar in allen Klassen des gleichen Pakets. docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
- Oh. Ich dachte, es war nur für Unterklassen. Das war eine einfache Antwort. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
protected
Schlagwort macht die Dinge sichtbar im gleichen Paket. Das ist der Fall, weil beide Klassen sind inpackage mypackage
.Hier ist eine schöne Tabelle, entnommen aus Oracle.com:
protected
, auf der anderen Seite, ist eine form des öffentlichen Zugangs, zur Verwendung im Unterricht konzipiert für öffentliche Erweiterung. Es würde wenig Sinn machen, um damit öffentliche-Erweiterung, aber ausschließen Paket-privater Zugriff.Protected access modifier ermöglicht den Zugriff im gleichen Paket + sub-Klassen in anderen Paketen.Können Sie sich daran erinnern, wie Sie standardmäßig Zugriff plus Vererbung.