0

保護された列挙変数を含む 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;
    }    
    ...
    ...
}

MyAction を拡張する特定のアクション MyAction1 を作成しました。

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が他のパッケージと同じパッケージに含まれていることと関係がありますか?

4

2 に答える 2

1

キーワードはprotected、同じパッケージ内で物を見えるようにします。両方のクラスが にあるためpackage mypackageです。

Oracle.comから取得した素敵な表を次に示します。

ここに画像の説明を入力

于 2013-09-01T16:18:05.003 に答える
0

保護されたアクセス修飾子は、同じパッケージ + 他のパッケージのサブクラスでのアクセスを許可します。デフォルト アクセスと継承として覚えることができます。

于 2013-09-01T16:24:07.427 に答える