2012-01-06 3 views
5

Если вы наследуете действие, в котором объявлены определенные переменные-члены, как вы получаете доступ к этим переменным-членам в подклассе, выполняющем наследование?Доступ к унаследованным переменным класса в java

+0

Также убедитесь, что у вас нет конфликта имен: http://java.sys-con.com/node/46344, если вы столкнулись с неожиданным поведением. – jefflunt

ответ

7

public или protected имена участников могут быть получены через this.memberName от любого конструктора или не static метода или инициализатора.

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

2

Если участники были объявлены private, или если они были объявлены с доступом по умолчанию (пакет), а ваш подкласс находится в другом классе, вы не можете получить доступ к переменным. Если были предоставлены аксессоры, вы можете использовать их. В противном случае они недоступны.

Если были объявлены члены protected или public, то доступ к ним, как если бы они были объявлены в собственном классе (this.var, или просто var, если нет никакой двусмысленности). Если у вас есть член в подклассе с тем же именем, что и суперкласс, вы можете использовать super.var для доступа к переменной суперкласса.

+0

Помогло ли downvoter объяснить? –

+1

+1 чтобы противостоять необъяснимому проголосованию. – mre

4
class A { 
    protected int a = 3; 
} 

class B extends A { 
    protected int b = 2; 

    void doIt() { 
     System.out.println("super.a:" + super.a); 
     System.out.println("this.b: " + this.b); 
    } 
} 
+0

Вам не нужно ключевое слово 'super'. – mre

+1

Правильно. Но это новичок. Поэтому я хочу сделать это абсолютно ясно. – ollins

+2

Вам понадобится только ключевое слово 'super', если поле было скрыто полем подкласса. –

1

Как заявил другие, открытые и защищенные поля могут быть доступны через this.field из подкласса. Пакет-частные поля также можно получить таким же образом, но только в том случае, если подкласс находится в том же пакете, что и родительский.

Доступ к закрытым полям недоступен, но к ним можно получить доступ, используя Java reflection, если это позволяют настройки безопасности. Обычно не рекомендуется практиковать (частные члены обычно являются приватными по какой-либо причине), но может быть полезна в некоторых ситуациях, например, для доступа к частным членам класса для целей тестирования кода. См. the answers to this question о том, как использовать отражение таким образом.

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