Как внутренний объект класса находится в памяти?

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 только InnerObject'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.

Другие вопросы по тегам