2013-08-29 4 views
2

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

Когда я пытаюсь скомпилировать этот код он говорит:

.../src/MyOuter.java:39: non-static variable inner cannot 
be referenced from a static context 

Код:

public class MyOuter{ 
    private int x; 

    public MyInner inner = new MyInner(); 

    public int getOuterX(){ 
     return x; 
    } 
    private void doStuff(){ 
     inner.go(); 
    } 

    class MyInner{ 
     public int getInnerX(){ 
      return x; 
     } 
     void go(){ 
      x = 42; 
     } 
    } 
    public static void main(String[] args) { 
     MyOuter outer = new MyOuter(); 
     outer.doStuff(); 
     System.out.println("outer.x = " + outer.getOuterX()); 
     System.out.println("inner.x = " + inner.getInnerX()); 

    } 
} 

Заранее спасибо за помощь!

+4

'inner' - поле экземпляра вашего класса' MyOuter'. У вас статический метод. В этом контексте он не существует. Вам нужно получить к нему доступ через экземпляр «MyOuter». –

ответ

3

С getInnerX() метод определен в MyInner класс. Вы не можете получить доступ к нему непосредственно без объекта MyInner класса .so изменить строку

System.out.println("inner.x = " + inner.getInnerX()); 

в

System.out.println("inner.x = " + outer.inner.getInnerX()); 
+0

Спасибо за быстрые ответы, ребята! Я выберу лучший ответ за 4 минуты, когда это позволит мне. –

2

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

{ 
    public static void main(String[] args) { 
    MyOuter outer = new MyOuter(); 
    MyInner inner = outer.inner; 
    outer.doStuff(); 
    System.out.println("outer.x = " + outer.getOuterX()); 
    System.out.println("inner.x = " + inner.getInnerX()); 
} 

От Understanding Instance and Class Members:

поля, которые имеют статический модификатор в их декларации, называются статическими полями или переменными класса. Они связаны с классом, а не с каким-либо объектом. Каждый экземпляр класса использует переменную класса, которая находится в одном фиксированном месте в памяти. Любой объект может изменить значение переменной класса, но переменные класса также можно манипулировать, не создавая экземпляр класса.

Поскольку ваша внутренняя переменная связана с объектом, на нее нельзя ссылаться, как статическая переменная. Если бы он был статичным, он был бы разделен между всеми экземплярами «MyOuter» и был бы доступен так, как вы там пытались.

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