【问题标题】:Accessing Protected Variable Of An Instance Of A Class That Extends An Abstract Base Class?访问扩展抽象基类的类实例的受保护变量?
【发布时间】: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 与其他人在同一个包中有关?

【问题讨论】:

标签: java abstract protected access-modifiers base-class


【解决方案1】:

protected 关键字使同一包中的内容可见。是这样的,因为你的两个班级都在package mypackage

这是一张漂亮的桌子,取自Oracle.com

【讨论】:

  • 现在我知道了。我想我可以通过将实用程序类移动到另一个包来测试它。
  • 那么有没有办法在基类中创建一个只能被子类访问而不能被同一个包中的其他类访问的变量?
  • 不,这是不可能的。
  • 我注意到你的桌子有些奇怪。如果你不定义修饰符,那么其他类可以访问它但子类不能访问(即使子类定义在同一个包中)?
  • 你的意思是,交换包和子类,这样我们就可以得到一个修饰符,它允许子类进入?它的方式对我来说效果更好:包是一组紧密耦合的类,它们都是 C++ 术语中的“朋友”。另一方面,protected 是一种公共访问形式,用于为公共扩展设计的类。允许公共扩展,但排除包私有访问是没有意义的。
【解决方案2】:

受保护的访问修饰符允许同一包中的访问+其他包中的子类。您可以将其记住为默认访问加继承。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2012-05-03
    • 2016-10-01
    相关资源
    最近更新 更多