2015-10-08 1 views
2

Мой вопрос, в абстрактных терминах:Как получить доступ к экземпляру закрывающего класса?

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

Как ключевые слова this и super позволяют получать доступ к определенным версии методов и переменных с одинаковыми именами в классе и родителей, есть ключевые слова, чтобы получить доступ к версии методов и переменных во вмещающих классов и вложенных классов?

Если вы запутались, продолжайте чтение:

Рассмотрим следующий пример кода, с двумя классами и внутренний класс. Main и Outer - это два класса в пакете «myPackage» (с другой стороны, я не мог получить следующий код для работы без пакета/в пакете по умолчанию по неизвестным причинам). Внутренний - это внутренний, нестатический класс Outer.

package myPackage; 

public class Outer { 
    public void activate() { 
     System.out.println("Outer.activate"); 
    } 

    public class Inner { 
     public void go() { 
      activate(); 
     } 
    } 
} 

package myPackage; 

import myPackage.Outer.Inner; 

public class Main { 

    public static void main(String[] args) { 
     Outer myOuter = new Outer(); 
     Inner myInner = myOuter.new Inner(); 
     myInner.go(); 
    } 
} 

Обратите внимание, что я построить Inner с myOuter.new Inner(). Поскольку Inner нестационарен, он должен быть построен поверх существующего экземпляра его охватывающего класса: в этом случае myOuter. Поэтому, когда я звоню myInner.go(), myInner звонит activate(), который вызывает activate() по связанному экземпляру входящего класса. Так myInner называет myOuter.activate(), а выход:

Outer.activate


Теперь рассмотрим следующие изменения:

package myPackage; 

public class Outer { 
    public void activate() { 
     System.out.println("Outer.activate"); 
    } 

    public class Inner { 
     public void activate() { 
      System.out.println("Inner.activate"); 
      activate(); 
     } 
    } 
} 

package myPackage; 

import myPackage.Outer.Inner; 

public class Main { 

    public static void main(String[] args) { 
     Outer myOuter = new Outer(); 
     Inner myInner = myOuter.new Inner(); 
     myInner.activate(); 
    } 
} 

Теперь Whe n Я вызываю myInner.activate(), myInner выходы, затем звонки activate(). Однако, поскольку Inner теперь имеет метод, называемый activate(), myInner использует эту версию вместо версии в экземпляре входящего класса. Так myInner называет myInner.activate(), а выход:

Inner.activate

Inner.activate

Inner.activate

Inner.activate

Inner.activate

Inner.activate

...

Снова и снова и заканчивается ошибкой переполнения стека. Поэтому мой вопрос в этом контексте заключается в том, как изменить Inner.activate() так, чтобы он выводил его, а затем вызывал свою закрытую версию экземпляра activate() вместо своей собственной. Вывод будет таким:

Inner.activate

Outer.activate

Заранее спасибо за вашу помощь.

ответ

3

Доступ this внешнего класса по предварительно поданной имя класса this ключевое слово, следующим образом:

Outer.this.activate(); 

Это решает объем this ссылаться на объект внешнего класса, который неявно хранится внутри объектов нестатических внутренних классов.

Demo.

+0

Отлично. Именно то, что мне нужно. – snickers10m