2013-03-21 2 views
3

Необходимо иметь больше понимания частных переменных и наследования. Раньше я понимал, что есть поле в классе, и когда я наследую класс, поля, которые не ограничены доступом (частные переменные), будут присутствовать в унаследованном классе. Но я могу использовать частные переменные в базовом классе, если существует общедоступный метод g/setter.Использование частной переменной в унаследованном классе - Java

Как я могу представить частную переменную в базовом классе.?

+1

Я не совсем уверен, в чем вопрос. Конечно, вы можете использовать частные поля с геттерами и сеттерами, это цель геттеров и сеттеров. –

+0

Я не понимаю вопроса. Пример, демонстрирующий вашу проблему, вероятно, поможет. – jlordo

+0

Я понятия не имею, в чем дело. Пожалуйста, попробуйте объяснить это снова. (и «переменные» называются «полями» в классах Java.) –

ответ

6
class A { 
    private int a; 
    public A(int a) { this.a = a; } 
    public int getA() {return a;} 
} 

class B extends A { 
    public B(int b) { super(b); } 
    public int getB() {return getA();} 
} 

int result = new B(10).getA(); 

результат будет 10. Частное поле a в классе A наследуется от B, но B не может получить к нему доступ напрямую. Только с использованием общедоступных/стандартных/защищенных методов доступа, определенных в классе A. B является A, поэтому он всегда имеет все те же поля, которые находятся в A, и возможные некоторые новые поля, определенные в классе B.

1

частные переменные/члены не наследуются. Это единственный ответ.

Предоставление общедоступных методов доступа - это способ инкапсуляции. Вы делаете свои данные конфиденциальными и предоставляете методы для получения или установки их значений, чтобы можно было контролировать доступ.

6

Это то, что Java учебник http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html говорит:

подкласс не наследует частные члены родительского класса. Однако, если суперкласс имеет общедоступные или защищенные методы для доступа к своим закрытым полям, они также могут использоваться подклассом.

Тем не менее, увидеть это

class A { 
    private int i; 
} 

class B extends A { 
} 

B b = new B(); 
Field f = A.class.getDeclaredField("i"); 
f.setAccessible(true); 
int i = (int)f.get(b); 

он отлично работает и возвращает значение поля i от экземпляра B. То есть, B имеет i.

+0

Ну конечно, но при использовании отражения выходят из окна всевозможные языковые гарантии. :) Частные поля становятся общедоступными, конечные поля становятся изменчивыми (для ссылочных типов), мир - это ваша устрица. – yshavit

+0

Мы можем сказать, что B не наследует частные поля A, но факт в том, что экземпляр B имеет все поля всех его суперклассов –

0

Экземпляр подкласса содержит частные переменные/методы своего суперкласса, но не может напрямую обращаться к этим частным членам (т. е. использовать оператор точек), доступ к частным членам суперкласса осуществляется через публичные члены суперкласса (конструкторы, методы).