2013-09-01 2 views
0

보호 된 enum 변수가 포함 된 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; 
    }  
    ... 
    ... 
} 

는 I가 특정 액션을 생성 MyAction1, 즉 연장 시켜라 : I는 (동일한 패키지) 싱글 유틸리티 클래스가

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) 보호 된 회원 조치 ID에 접속할 수 있습니다.

왜 내가 MyAction1의 인스턴스 (기본 클래스 시켜라에 포함)을의 actionId 보호 된 멤버에 액세스 할 수 있다는 것입니다? 보호 된 멤버는 하위 클래스에만 액세스 할 수 있다고 생각했습니다.

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에서 같은 패키지 + 서브 클래스에 액세스 할 수 있습니다.