2013-04-13 3 views
3

Это только вопрос знаний/любопытства.Ссылка на прилагаемый экземпляр из внутреннего класса

Спустя несколько лет на Java это только меня поразило.

class Foo { 

    class Bar{ 

     Foo.this.doSomething(); 

    } 

} 

Когда я смотрю на Foo.this, я предположил бы, что это статическая ссылка, которая, очевидно, не так.

Я знаю, что это часть спецификации Java, но точно, что происходит, когда вы используете <Class>.this?

Является ли это одним из тех, что «это просто»?

+0

@noob. Пожалуйста, не изменяйте тег Android. Я использую только Java, потому что я создаю приложения для Android. Этот вопрос также имеет большое значение для разработчиков Android. – Simon

+1

Во-первых, Bhesh Gurung - это тот, кто удалил тег Android, а не noob. Тот факт, что вы используете андроид, не имеет никакого отношения к пометке. Я мог бы просто отметить этот вопрос как Windows, если мне удастся выполнить Java-программирование для создания приложений Windows. Ваш вопрос не использует какие-либо связанные с Android функции, поэтому он не отменяет тег android. Я воздержался от восстановления вашего редактирования, но исключительно из-за страха бессмысленной войны за редактирование. – Brian

+0

@Brian. Ну, это все немного глупо, но если большинство разработчиков Android также подписались на ярлык Java, я могу согласиться с вами. Поскольку они этого не делают, и Android-разработчики являются очень важной группой в наборе всех разработчиков Java, я почтительно не согласен. Спасибо, что оставили редактирование. – Simon

ответ

7

Я знаю, что это часть спецификации Java, но точно, что происходит, когда вы используете .this?

Он просто ссылается на «скрытое» поле в пределах Bar. Это проще всего декомпилировать. Вы увидите, что есть конструктор Bar, ссылающийся на экземпляр Foo. Эта ссылка хранится в поле, а затем, когда вы используете Foo.this, он просто обращается к этому полю. Так если вы хотите положить ваш Foo.this.doSomething() в someMethod вызов, ваш код аналогичен:

class Foo { 

    static class Bar { 
     private final Foo $foo; 

     Bar(Foo foo) { 
      this.$foo = foo; 
     }  

     public void someMethod() { 
      $foo.doSomething(); 
     } 
    } 
} 
+0

Спасибо, Джон, я этого никогда не знал. Это все так ясно, когда выкладывается следующим образом:) – Simon

+0

@JonSkeet Хороший ответ, но если это выглядит так, как после декомпиляции, как это работает, когда внутренний класс имеет параметризованный конструктор? –

+0

@MarkW: Почему бы вам не попробовать? :) (Он просто добавит дополнительный параметр в список, который вы написали ...) –

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