Как внутренний объект класса находится в памяти?
Outer outer = new Outer();
Object
из Outer
класс создается в куче, а ссылочная переменная указывает на него.
Если я правильно понимаю, когда я пишу
Outer.Inner inner=outer.new Inner();
объект Inner
класс создается на куче и inner
указывает на это. В куче у нас есть два отдельных объекта, которые содержат свои собственные переменные экземпляра.
Но если я напишу
Outer.Inner inner=new Outer().new Inner();
еще два Object
будет создан на куче один для Outer
и другое для Inner
, Но со ссылкой на inner
только Inner
Object's
участники доступны. Кто имеет в виду внешнее Object
на куче? Если на него не ссылается ни одна ссылка, он должен иметь право на сборку мусора, которая затем будет влиять на использование inner
,
3 ответа
Внутренний класс содержит скрытую ссылку на его внешний экземпляр класса. Эта скрытая ссылка поддерживает внешний экземпляр класса, если нет других ссылок на него.
Чтобы увидеть это в действии, возьмите этот исходный код и скомпилируйте его:
public class Outer {
public class Inner {
}
}
Теперь используйте инструмент проверки классов Java javap
чтобы увидеть скрытую ссылку:
$ javap -p Outer\$Inner
Compiled from "Outer.java"
public class Outer$Inner {
final Outer this$0;
public Outer$Inner(Outer);
}
Вы увидите, что есть скрытая ссылка на область действия пакета, которая называется this$0
типа Outer
- это ссылка, о которой я говорил выше.
Каждый экземпляр внутреннего класса содержит ссылку на экземпляр своего внешнего класса. Это ссылка, которую вы получаете, когда пишете Outer.this
в одном из методов внутреннего класса. Анонимный Outer
экземпляр не будет иметь право на сборку мусора, если все Inner
связанные с ним экземпляры также имеют право на сборку мусора.
Естественно, внутренняя часть удерживает сильные ссылки на вещи, на которые она хочет иметь сильные ссылки - как и другая половина его переменных экземпляра, которые находятся в Outer.