У меня есть абстрактный класс MyAction, который содержит защищенную переменную enum. Класс определяется следующим образом:Доступ к защищенной переменной экземпляра класса, который расширяет абстрактный базовый класс?
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;
}
...
...
}
Я создал определенное действие, MyAction1, которая простирается MyAction:
package mypackage;
public class MyAction1 extends MyAction {
public MyAction1() {
super(ActionId.ACTION1);
}
...
...
}
У меня есть одноэлементный класс полезности (в том же пакете), который создает экземпляр MyAction1 и сохраняет его в 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;
}
...
...
}
Обратите внимание, что в метод actions.put (myAction1.actionId, мой Action1) Я могу получить доступ к защищенному члену actionId.
Почему я могу получить доступ к защищенному члену ActionId (содержится в базовом классе MyAction) экземпляра MyAction1? Я думал, что защищенные члены доступны только для подклассов.
Имеет ли это какое-либо отношение к MyActionFactory находится в той же упаковке, что и другие?
Защищенные элементы доступны во всех классах одного и того же пакета. http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html –
Ох. Я думал, что это только подклассы. Это был легкий ответ. :) –