Мой вопрос, в абстрактных терминах:Как получить доступ к экземпляру закрывающего класса?
Как нестатический внутренний класс может получить доступ к экземпляру охватывающего класса? Это необходимо для использования экземпляра в качестве параметра в вызовах методов и доступа к методам и переменным с одинаковыми именами между внутренним и охватывающим классом.
Как ключевые слова 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
Заранее спасибо за вашу помощь.
Отлично. Именно то, что мне нужно. – snickers10m