2015-07-01 3 views
1

Следующая является законным (по моим сведениям):В чем причина OuterClass.this.someMethod()?

class Outer { 
    void someMethod() { 
     // do something 
    } 

    class Inner { 
     void innerMethod() { 
      Outer.this.someMethod(); 
     } 
    } 
} 

Хотя я понимаю, что происходит, и то, что результат, я не понимаю, почему это хорошо.

Я в основном смущен тем, как экземпляр внешнего класса доступен через синтаксис статического элемента: Outer.this Не следует ли this, ссылка на конкретный экземпляр Outer, быть чем-то НО статическим? Является ли синтаксис тем же, но функциональность отличается, или this как-то статическое поле Outer?

Иными словами, этот код обращается к экземпляру внешнего класса с использованием синтаксиса Class.field, который я всегда ассоциировал со статическими членами. Однако, если это один конкретный экземпляр класса, как он может быть статичным? По этой логике другой экземпляр Outer вернет другой Outer-объект из Object.this ... который не является статичным ... мой мозг болит.

ответ

4

this не статична действительно. Это просто обозначение, используемое для дифференциации различных объектов, живущих в одном и том же объеме.

Без этих обозначений не было бы способа получить ссылку на объект Outer объекта Inner. Замените Outer.this.someMethod() на this.someMethod(), и вы получите ошибку компиляции, потому что this сам по себе относится к объекту Inner (который не имеет метода someMethod).

3

В вашем внутреннем классе this ссылается на ваш экземпляр Inner, поэтому вам нужно обратиться к внешнему экземпляру или полям внешнего экземпляра, если они столкнулись с полями во внутреннем экземпляре. Следовательно, этот синтаксис, чтобы указать, к какому экземпляру того класса, о котором вы говорите, это не статический доступ!

См https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

0

Это относится к текущему объекту. Статические поля/методы относятся к классу в целом. Внутри внутреннего класса это будет представлять объект класса Inner. this.someMethod() выдаст ошибку, поскольку внутри внутреннего класса отсутствует someMethod(). Таким образом, вам нужен способ различать внутренние и внешние поля классов, если они одинаковы. Outer.this.someMethod() ~ относится к функции someMethod() внешнего класса.

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