Вложени вътрешни класове

В литературата за Java има термини като "вътрешни класове"вътрешни класовеи "вложени класове"вложени класове. За вложени класове вътрешните класове са подмножество. Въпреки това, често всички вложени класове се разбират под вътрешни класове - това е такъв парадокс.

Дефиниция на клас може да бъде поставена в дефиницията на друг клас. Такива класове се наричат ​​вложени или вътрешни класове. Обхватът на вложения клас е ограничен до обхвата на външния клас. Следователно, ако клас B е създаден вътре в клас A, тогава клас B не може да съществува независимо от клас A. Вложените класове ви позволяват да групирате класове, които логически принадлежат един на друг и да контролирате достъпа до тях.

Има два вида вложени класове – статични (static-nested-class) и нестатични (non-static). Всъщност нестатичните вложени класове имат друго име - вътрешни класове. Външният клас понякога се нарича също обхващащ клас.

вложени класове

Ако нямате нужда от връзка между обекта на вътрешния клас и обекта на външния клас, можете да направите вътрешния клас статиченстатичен. Такъв клас се нарича вложенвложен. Използването на статичен вътрешен клас означава следното:

  • за да създадете обект от статичен вътрешен клас, нямате нужда от обект от външния клас;
  • от обект на вложен клас, не можете да получите достъп до нестатичните членове на външния клас.

Вложен клас има достъп до членовете на своя външен клас, включително частни членове. Външният клас обаче няма достъп до членовете на вложения клас. Вложеният клас е член на външния клас.

Статичен классе декларира с ключовата думаstatic. В този случай класът трябва да препраща към нестатичните членове на своя външен клас, използвайки обекта, т.е. няма директен достъп до нестатичните членове на своя външен клас. На практика тези класове се използват рядко.

вътрешни класове

Нестатичните вложени класове се наричат ​​още вътрешни класовевътрешен клас. Вътрешният клас има достъп до всички променливи и методи на своя външен клас и може директно да препраща към тях. Вътрешните класове се създават вътре в обграждащия клас:

Вътрешният класInnerе дефиниран в обхвата на класOuter. Следователно всеки код в класаInnerможе директно да има достъп до променливите x1, x2 на външния клас. След създаване на екземпляр на класаOuterсе извиква неговият методsumma ()с параметри, който създава екземпляр на класаInnerс извикване на методаdisplay ().

Вътрешен класможе да бъде дефиниран не само на ниво клас, но и вътре в метод или в тялото на цикъл. Ако трябва да създадете обект от вътрешния клас, който не е в статичен метод на външния клас, типът на този обект трябва да бъде указан във форматExternalClassName.InnerClassName.

Обектът на вътрешния клас е свързан с външния обект-създател и има достъп до неговите членове без допълнителни описания. Всички членове на външния клас са достъпни за вътрешните класове. Ако трябва да получите препратка към обект от външен клас, тогава трябва да използвате името на външния клас с ключовата думаthis, разделени с точка, например: Outer.this.

Статични вътрешни класове

Статичните вътрешни класове се декларират вътре в основния клас и се обозначават с ключовата думастатичен. Те нямат достъп до членовете на външния клас, с изключение на статичните.

Статичният вътрешен клас може да съдържа статични полета, методи и класове, за разлика от други видове вътрешни класове. Пример:

Местни класове

Локалните класове се декларират в методите на основния клас и могат да се използват само в тези методи. Те имат достъп до членовете на външния клас, както и до локалните променливи и параметрите на метода, при едно условие - променливите и параметрите, използвани от локалния клас, трябва да бъдат декларирани катоfinal. Локалните класове не могат да дефинират (но могат да наследяват) статични полета, методи и класове (с изключение на константи). Пример:

Локалните класове имат няколко ограничения:

Анонимни класове, анонимен клас

Анонимните класове се декларират в рамките на методите на основния клас и могат да се използват само в тези методи. За разлика от локалните класове, анонимните класове нямат име. Основното изискване за анонимен клас е, че той трябва да наследи от съществуващ клас или да имплементира съществуващ интерфейс. Анонимните класове не могат да съдържат дефиницията на статични полета, методи и класове (с изключение на константи), но могат да ги наследяват. Пример:

Анонимните класове се използват широко от Java програмистите.Анонимният класняма име. Класически пример за анонимен клас:

Въз основа на анонимния клас се създава нишка и се стартира с помощта на метода за стартиране на класаThread. Синтаксисът за създаване на анонимен клас се основава на използването на оператораnewс името на класа (интерфейс) и тялото на новосъздадения анонимен клас.

Основното ограничение при използването на анонимни класове е невъзможността за описаниеконструктор, тъй като класът няма име. Аргументите в скоби се използват автоматично за извикване на конструктора на базовия клас със същите параметри. Ето един пример:

Тъй катоанонимният класе локален клас, той има всички същите ограничения като локалния клас.

Използването на анонимни класове е оправдано в много случаи, по-специално когато: