【发布时间】:2013-09-04 19:15:47
【问题描述】:
我有一个名为 MyAction 的抽象类,其中包含一个受保护的枚举变量。类定义如下:
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, myAction1) 方法中,我可以访问受保护的成员 actionId。
为什么我可以访问MyAction1实例的受保护成员actionId(包含在基类MyAction中)?我认为受保护的成员只能由子类访问。
这是否与 MyActionFactory 与其他人在同一个包中有关?
【问题讨论】:
-
受保护的成员可以在同一个包的所有类中访问。 docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
-
哦。我认为这只是子类。这是一个简单的答案。 :)
标签: java abstract protected access-modifiers base-class