2013-09-01 70 views
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; 
    }  
    ... 
    ... 
} 

我創建了一個特定的動作,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有什麼關係?

+1

受保護的成員可以在同一包中的所有類中訪問。 http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html –

+0

哦。我認爲這只是子類。這是一個簡單的答案。 :) –

回答

0

protected關鍵字使東西在同一個包中可見。這是什麼情況,因爲你的兩個班都在package mypackage

這裏是一個不錯的表,從Oracle.com採取:

enter image description here

+0

現在我知道了。我想我可以通過將實用工具類移到另一個包來測試它。 –

+0

因此,在基類中只能訪問子類而不能訪問同一個包中的其他類的變量是沒有辦法的? –

+0

不,這是不可能的。 –

0

受保護的訪問修飾符允許在同一個包+子類的訪問在其他packages.You能記住它作爲默認訪問加的繼承。

相關問題