2013-07-10 5 views
12

В внутренних классах доступны переменные внешнего класса, но локальными переменными метода нет. Я понял часть о том, что локальные переменные метода недоступны, но я хочу знать, почему доступны переменные внешнего класса?Доступ к переменной внешнего класса во внутреннем классе

Я понимаю, что, поскольку внутренний класс связывается с внешним классом, до тех пор, пока родитель доступен, ребенок может получить доступ к своим родительским переменным. Я прав?

+1

Статический внутренний класс или нестатический? –

+2

@ DuncanJones: внутренние классы всегда нестатические. Посмотрите здесь .. http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html –

+1

@VishalK Спасибо, я ошибочно называл вложенные классы * внутренними классами * годами. Упс! –

ответ

28

Предполагая, что ваш внешний класс называется Outer, из объема внутреннего класса (нестатического), Outer.this.foo, чтобы попасть на поле.

Например,

Outer.this.foo=new ArrayList<>(); 

, где наружный это имя класса и идентифицирует foo поле.

Вы также можете взять его непосредственно как foo=new Baz(), но он будет выбирать внутреннее поле, если есть конфликт имен из-за затенения.

, если это статический внутренний класс, вам нужен явный пример:

outerInstance.foo=new ArrayList<>(); 

или если поле для доступа является статическим, доступ к нему, как обычно, с:

Outer.staticFoo=new ArrayList<>(); 
+0

Привет, спасибо за ответ. Здесь мой вопрос: если внутренний класс и внешний класс используют переменную одновременно, возможно, есть вероятность одновременных проблем. Но внутренние классы используют переменную как два метода класса use.so, нам нужно будет использовать синхронизацию, чтобы справиться с этим с помощью внутреннего класса. – kiran

+1

@ user5 Нет, не за пределами какой-либо синхронизации, которую вам нужно будет делать в любом другом случае. Внутренний и внешний классы не создают новые потоки. – hexafraction

0

Ответ: Внешние переменные класса в java доступны из-за лексической области.

Что такое лексический охват?

Объем, определенный в порядке написания кода. Допустим, что ваша структура вашего класса выглядит следующим образом:

OuterMost 
    --Inner 
    --InnerMost 

Тогда внутренний самый класс будет иметь доступ к переменным из внутреннего и внешнего большинства.

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