Ссылка на не статическую переменную из статического внутреннего класса - PullRequest
4 голосов
/ 25 мая 2011

Мне нужно сослаться на переменную класса верхнего уровня из метода внутри статического класса.

Этот метод должен воздействовать на уникальные экземпляры класса верхнего уровня, поэтому создается впечатление, что я не должен создавать экземпляр класса верхнего уровня внутри статического класса.

В основном я хочу что-то вроде

public class TopLevel{
   // private
   int innerV

   public static class Inner implements X {
     for(i=0; i<innerV,i++){
         doSomething 
     }
   }
}

Можно ли просто сказать this.innerV или что-то подобное в цикле for и подобных местах?

Ответы [ 3 ]

8 голосов
/ 25 мая 2011

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

Объявление вашего внутреннего класса static удаляет эту ссылку, поэтому вам нужно либо передать экземпляр внешнего класса методу внутреннего класса (или его конструктору) в качестве параметра, либо создать его внутри метода.

1 голос
/ 25 мая 2011

Вы не можете этого сделать . Создайте экземпляр TopLevel и, если вы сделаете аксессор innerV (getter / setter) или сделаете его общедоступным, тогда вы можете.

public class TopLevel {
   public int innerV

   public static class Inner implements X {
     for(i=0; i<innerV,i++){
         TopLevel tl = new TopLevel()
         tl.innerV = 12345678;
     }
   }
}
0 голосов
/ 26 мая 2011

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

...