2016-06-08 3 views
1

Почему d не доступен из класса Inner и b доступен из того же класса?почему эта переменная Variables настолько отличается от внутреннего класса в классе внутри другого класса

public class Outer { 
    public int a = 1; 
    private int b = 2; 

    public void method(final int c) { 
     int d = 3; 
     class Inner { 
      private void iMethod(int e) { 
      } 
     } 
    } 
} 
+1

Подумайте о времени жизни d, по сравнению с временем жизни экземпляра класса Inner. –

+1

Хотя он поддерживается языком, лучше не определять классы в методах ... –

+0

Он должен быть доступен. Что заставляет вас думать, что это не так? Вы используете Java 8 или что-то более старое? –

ответ

1

Это происходит потому, что a и b являются свойствами, тогда как class Outerd представляет собой переменную внутри метода, называемого method. Поэтому он должен иметь доступ к d.

Вот пример от tutorialspoint.

В Java мы можем написать класс внутри метода, и это будет локальный тип . Как и локальные переменные, область внутреннего класса ограничена в рамках метода.

Метод-локальный внутренний класс может быть создан только внутри метода , где определяется внутренний класс. Следующая программа показывает, как использовать локальный внутренний метод.

public class Outerclass{ 

//instance method of the outer class 
void my_Method(){ 
    int num = 23; 

    //method-local inner class 
    class MethodInner_Demo{ 
    public void print(){ 
     System.out.println("This is method inner class "+num);  
    } 
    }//end of inner class 

    //Accessing the inner class 
    MethodInner_Demo inner = new MethodInner_Demo(); 
    inner.print(); 
} 

public static void main(String args[]){ 
    Outerclass outer = new Outerclass(); 
    outer.my_Method();   
} 
} 

This is method inner class 23

+0

@SotiriosDelimanolis Исправлен ответ. –

1

Inner является local class, поскольку он объявлен локально в блоке Java кода, а не в качестве члена класса. Поэтому Inner может обращаться к любым членам, таким как a и b, включая частные члены, содержащего класс Outer. И он не может получить доступ к d, потому что d не объявлен final, для версий Java 7 и старше.

[..] локальный класс может использовать локальные переменные, параметры метода, и даже параметры исключений, которые находятся в ее области видимости, но только если эти переменные или параметры объявлены окончательными. Это связано с тем, что время жизни экземпляра локального класса может быть намного длиннее, чем выполнение метода, в котором определяется класс. Для этой причины локальный класс должен иметь частную внутреннюю копию всех локальных переменных , которые он использует (эти копии автоматически генерируются компилятором ). Единственный способ гарантировать, что локальная переменная и приватная копия всегда совпадают, - это настаивать на том, что локальная переменная является окончательной.

См. here.

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