java: расширяет внутренний класс - PullRequest
1 голос
/ 02 апреля 2020

jdk версия: 1.8.0_241

Существует класс, расширяющий внутренний класс. Код следующий:

class WithInner {
    class Inner {

    }
}

public class ExtendInnerClass extends WithInner.Inner {
    ExtendInnerClass(WithInner withInner) {
        withInner.super(); 
    }
}

Чтобы соединить объект класса InInner и объект класса Inner, мы должны использовать метод super () . Но когда я декомпилировал файл класса, я обнаружил кое-что интересное.

public class ExtendInnerClass extends Inner {
    ExtendInnerClass(WithInner withInner) {
        withInner.getClass();
        super(withInner);
    }
}

Я обнаружил, что компилятор не только использует метод super (), но также withInner.getClass () .

зачем он это делает?

1 Ответ

1 голос
/ 04 апреля 2020

Внутренний объект класса обычно должен содержать ссылку на внешний объект класса.

Без withInner.getClass () и withInner равен нулю , может привести к две проблемы:

  1. внутреннему классу не удалось связать с внешним классом (.this имеет значение null).
  2. внутренний класс загружен до загрузки внешнего класса, он не соответствует принципу jvm.

Здесь решает эту проблему, выдавая исключение NullPointerException через withInner.getClass ()

...