Статичните вложени класове1 са точно като външните класове, с изключение на това, че имат достъп до всички членове на външния клас, независимо от квалификатора за достъп. Те съществуват отделно от всеки екземпляр на външния клас, така че се нуждаят от препратка към екземпляр, за да имат достъп до променливи на екземпляр или нестатични методи на външния клас.
Нестатичните вложени класове (наречени вътрешни класове) възникват само в контекста на екземпляр на външния клас. Когато са конструирани, те имат автоматично генерирано второ поле this
, до което можете да получите достъп от вътрешния клас, като използвате синтаксиса Outer.this
. Всеки екземпляр на вътрешния клас е ограден от един екземпляр на външния клас. Отново, всички привилегии за достъп на статичните вложени класове се отнасят за вътрешните класове. Но тъй като те вече имат наличен екземпляр на външния клас, те могат автоматично да имат достъп до променливи на екземпляр и методи на външния клас.
За хубава (и много подробна) дискусия на вътрешните класове и спецификаторите за достъп можете да прочетете Спецификация на вътрешния клас. Той описва, наред с други неща, как вложен клас получава достъп до private
члена на своя външен клас(ове). По-щадящо четене е урокът за вложени класове.
Извън темата настрана: Да предположим, че имате следната структура на класа:
public class O {
public O() { ... }
public class I { // an inner class
public I() { ... }
...
}
...
}
и сте създали екземпляр на O
:
O outer = new O();
Сега да предположим, че искате да създадете екземпляр на O.I
. не можете просто да използвате new O.I()
, защото новото копие на I
трябва да бъде оградено от конкретно копие на O
. За това Java предоставя следния синтаксис:
O.I inner = outer.new O.I();
Тогава inner
ще има второто си поле this
, настроено да препраща към outer
.
Имайте предвид, че този синтаксис на "квалифициран new
оператор" се използва само за вътрешни класове; би било ненужно (всъщност, грешка), ако I
беше static
вложен клас.
1 Често ще срещнете израза „статичен вътрешен клас“ (включително, смущаващо, в по-ранна версия на този отговор). Това е неправилна терминология. В Java „вътрешните класове“ са специално не-static
вложени класове.
person
Ted Hopp
schedule
31.01.2011