Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП зачет.docx
Скачиваний:
89
Добавлен:
01.04.2022
Размер:
3.08 Mб
Скачать
  1. Внутренние классы

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

public class Outer {

public class Inner {

}

}

Отличие от статического вложенного класса в том, что внутренний класс связан с внешним классом через экземпляр, или через объект класса.

Внутренние классы есть смысл использовать, если они будут использовать элементы родителя, чтобы не передавать лишнего в конструкторах. Внутренний класс неявно наследуется от внешнего класса без использования ключевых слов. То есть, во внутреннем классе можно использовать весь унаследованный функционал внешнего класса.

Внутренний класс стоит использовать, когда нам нужна инкапсуляция. Во внутреннем классе мы, таким образом закрываем всё от «внешнего мира».

  1. Локальные классы

Локальный класс — это вложенный класс, объявленный внутри другого класса и некоторого блока кода этого класса, то есть объявленный между фигурными скобками {}. Этот блок может быть статическим блоком, циклом, телом if и т.д. Чаще всего локальные классы объявляются внутри тела метода.

Пример: public class OuterLocal {

OuterLocal(){

// начало блока конструктора

/*объявление локального класса в конструкторе OuterLocal*/

class LocalInnerClass {

LocalInnerClass(){}

}

/* создаем экземпляр в том же блоке*/

LocalInnerClass localObj = new LocalInnerClass();

// окончание блока конструктора

}

Локальный класс объявленный внутри блока кода другого класса не является членом класса, к которому относится блок, а принадлежит самому блоку, точно так же, как обычная локальная переменная. Область видимости такого класса — это область видимости окружающего его блока. Такие классы недоступны за пределами внешнего класса, поскольку нет никаких способов обращения к ним, но их экземпляры – это обычные объекты, которые позволяется, например, передавать в качестве аргументов или возвращать из методов. Время жизни локального внутреннего класса, это время пока существует хотя бы одна ссылка на него. Такой класс существует внутри блока кода и время его жизни ограниченно этим блоком. Как и нестатические вложенные классы, и по тем же причинам, локальные классы не могут иметь static поля, исключение составляют константы, объявленные как static final.

Основное применение локальные классы находят в тех случаях, когда необходимо написать класс, который будет использоваться внутри одного метода. Создание локального класса – способ не загромождать пространство имен.

  1. Анонимные классы

Анонимным классом называется класс, в котором программист не задает явно имя экземпляру. Простой пример:

new AnyClass();

В анонимном классе явно не задается конструктор класса, а используется конструктор базового класса. Мы можем создать анонимный класс, передав некоторое значение в конструктор базового класса.

new AnyClass(80);

Анонимные классы применяются там, где вам необходим функционал анонимного класса без повторного использования. При повторном использовании есть смысл создать отдельный класс. Добавить новый функционал анонимному классу вы можете так:

new AnyClass(){ // Тело нового анонимного класса. Новый функционал вашего класса

};

Анонимный вложенный класс не является членом содержащего его класса. Анонимный класс определяется и порождает экземпляр в момент использования. Он не определяется вместе с остальными членами включающего его класса. Анонимный класс можно поместить в любом месте программы, где разрешается применять локальные переменные. В зависимости от контекста анонимный класс, член другого класса, ведет себя по-разному. В нестатическом контексте появляется окружающий его экземпляр, в статическом контексте ведет себя как статический.