2013-09-01 1 views
0

У меня есть абстрактный класс MyAction, который содержит защищенную переменную enum. Класс определяется следующим образом:Доступ к защищенной переменной экземпляра класса, который расширяет абстрактный базовый класс?

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 могут помнить, как доступ по умолчанию плюс наследование.

Смежные вопросы