Локальный внутренний класс - PullRequest
8 голосов
/ 30 мая 2011

Я прочитал учебник по внутренним классам и ничего не понимаю.Говорят, что внутренний класс содержит скрытую ссылку на внешний класс, поэтому я задаю несколько вопросов через этот простой класс:

public class OuterClass {

public void doSomething() {
    JButton button = new JButton();
    button.addActionListener(new ActionListener() {

      public void actionPerformed(ActionEvent e) {                
      }
    });
  }
}

Итак, у нас есть один локальный внутренний класс, который находится внутри метода doSomething() иУ меня есть несколько вопросов.

  1. Содержит ли этот локальный внутренний класс ссылку на OuterClass, поскольку он локальный?

  2. Этот локальный внутренний класс остается в памятипосле завершения метода doSomething()?

  3. Есть ли ситуации, когда OuterClass имеет право на GC, но на другие внутренние классы все еще ссылаются другие классы?Что случилось бы?

1 Ответ

8 голосов
/ 30 мая 2011
  1. Да, внутренний класс имеет ссылку на экземпляр OuterClass.

    Это можно проверить, обратившись к OuterClass.this в методе.

  2. Да, экземпляр внутреннего класса будет продолжать существовать после завершения метода.

    Выход из метода не влияет на время жизни объекта.Как и любой другой объект, он становится подходящим для GC, когда на него больше нет ссылок.Поскольку JButton будет содержать ссылку на него, он останется в памяти.

  3. OuterClass экземпляр не может получить право на GC до тех пор, покатак как экземпляр внутреннего класса достижим.

    Причина этого # 1: экземпляр внутреннего класса имеет ссылку на экземпляр внешнего класса, что означает, что внешний класс не может получить право на GC до тех пор, покавнутренний класс не подходит одновременно (т. е. оба больше не доступны).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...