#17 – Вложенные и анонимные классы

#17 – Вложенные и анонимные классы

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

Видеоурок

Вложенный класс

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


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


При этом, создавать класс наследник было бы неразумно, ведь автомобиль и двигатель хоть и являются одним целым, но все же имеют мало общих характеристик. Получается, что идеальным вариантом станет создание вложенного класса. 


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


Пример вложенного класса:

class Auto {
 String model;

	class Engine {
		private boolean working = false;

		public void work () {
			working = true;
			System.out.print("Двигатель запущен!");
		}
	}

	Engine en = new Engine();
}

public class Main {

	public static void main(String[] args) {
		Auto bmw = new Auto();
		bmw.en.work();
	}
}

Подобный принцип используется во многих классах Java. Как пример, если вспомнить класс «System», то в нём также есть вложенный класс и доступ к нему мы получаем за счёт объекта «out»:

// System - основной класс
// out - объект на основе вложенного класса
// print - метод, что находиться внутри вложенного класса
System.out.print("");


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

Анонимные классы - это классы, что не имеют имени и их создание происходит в момент инициализации объекта. 


Такие классы много где используются в Java и с ними вы ещё часто будете сталкиваться. 


Рассмотрим небольшой пример. Предположим что у нас есть интерфейс, который необходимо реализовать. Для реализации можно создать отдельный класс, в нём реализовать интерфейс, далее создать объект на основе класса и через объект ссылаться на методы классы.


Звучит логично, но не оправдано с точки зрения количества действий. Куда проще создать объект и для него сразу выполнить создание анонимного класса.


Пример создания анонимного класса:

Auto car = new Auto() {
	void flyingMoto () {
		System.out.print ("Летающий мотоцикл");
	}
};

Материалы для курса

Чтобы скачивать материалы к видеокурсам необходимо оформить подписку на сайт

Задание к уроку

Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям

Большое задание по курсу

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

Также стоит посмотреть

Изучение таск-менеджера Gulp 4
5 уроков
Разработка Android программы. Создание чата
6 уроков
Java 3D Game / Разработка игры Minecraft
5 уроков
MERN Stack / Разработка веб-приложения
9 уроков
Изучение стека MEAN: MongoDB, Express, Angular и Node JS
10 уроков
Java до профи: основы, UI дизайн и Android разработка
Комментарии (7)
Добавить комментарий

Анастасия 26 сентября 2024 в 12:23

Пример из лекции
Auto car = new Auto() {
void flyingMoto() {
System.out.print("Летающий мотоцикл");
}
};


В идее будет выдавать ошибку. Метод нельзя вызвать потому что он не объявлен в классе Auto, не является его частью и система его не будет видеть. Пример - НЕ РАБОЧИЙ КОД
Ответить

Rzevsky 03 апреля 2024 в 21:59

Стало:

        House.Bedroom bedroom1 = house1.new Bedroom(1, 17, "одинарная");
        House.Bedroom bedroom2 = house1.new Bedroom(1, 17, "одинарная");
        House.Bedroom bedroom3 = house1.new Bedroom(1, 17, "одинарная");

        System.out.println(bedroom1.getBedroom());
        System.out.println(bedroom2.getBedroom());
        System.out.println(bedroom3.getBedroom());
Ответить

Rzevsky 03 апреля 2024 в 21:57

Послушал следующий урок и задумался - почему IDE заставила меня вложенный класс Bedroom объявить как static. Когда я так хотел привязать комнаты к объекту house1. Получается, я объекты Bedroom реализовал через одно место. Через массив, и пр.

Кстати, для поиска вдохновения прекрасно помогает чатGBT. Что бы я без него делал...

В итоге, было:

house1.bedrooms[0] = new House.Bedroom(1, 17, "одинарная");
house1.bedrooms[1] = new House.Bedroom(2, 22, "полуторная");
house1.bedrooms[2] = new House.Bedroom(3, 30, "двойная");

System.out.println(house1.bedrooms[0].getBedroom());
System.out.println(house1.bedrooms[1].getBedroom());
System.out.println(house1.bedrooms[2].getBedroom());


Стало:
Ответить

Rzevsky 03 апреля 2024 в 21:37


public class Main {
    public static void main(String[] args) {
        House house1 = new House("Ленина", 15, 3);
        House.Bedroom bedroom1 = house1.new Bedroom(1, 17, "одинарная");
        House.Bedroom bedroom2 = house1.new Bedroom(1, 17, "одинарная");
        House.Bedroom bedroom3 = house1.new Bedroom(1, 17, "одинарная");

        System.out.println(house1.getHouse());
        System.out.println(bedroom1.getBedroom());
        System.out.println(bedroom2.getBedroom());
        System.out.println(bedroom3.getBedroom());

        House apartments1 = new House("Пушкина", 343, 2) {
            protected int apartmentNr;

            @Override
            public void setHouse(String street, int houseNr, int numberOfBedrooms) {
                super.setHouse(street, houseNr, numberOfBedrooms);
                this.apartmentNr = 15;
            }

            @Override
            public String getHouse() {
                return "Адрес: " + street + " " + houseNr + "-" + apartmentNr + ". Спален: " + numberOfBedrooms + ".";
            }
        };
        System.out.println(apartments1.getHouse());

    }
}





public class House {
    protected String street;
    protected int houseNr;
    protected int numberOfBedrooms;


    public House(String street, int houseNr, int numberOfBedrooms) {
        setHouse(street, houseNr, numberOfBedrooms);
    }

    public void setHouse(String street, int houseNr, int numberOfBedrooms) {
        this.street = street;
        this.houseNr = houseNr;
        this.numberOfBedrooms = numberOfBedrooms;
    }

    public String getHouse() {
        return "Адрес: " + street + " " + houseNr + ". Спален: " + numberOfBedrooms + ".";
    }


    class Bedroom {
        public int bedroomNr;
        public int area;
        public String bedSize;

        public Bedroom(int bedroomNr, int area, String bedSize) {
            this.bedroomNr = bedroomNr;
            this.area = area;
            this.bedSize = bedSize;
        }

        public String getBedroom() {
            return "Площадь спальни №" + bedroomNr + ": " + area + ". Размер кровати: " + bedSize + ".";
        }
    }

}
Ответить

Rzevsky 03 апреля 2024 в 20:05

КвартирУ!
Ответить

Rzevsky 03 апреля 2024 в 20:00

Снова хотел упростить, уйдя от автомобилей. Но вложенный класс Bedroom потребовал несколько экземпляров для одного дома. Пришлось применить массив типа Bedroom.

Анонимный класс реализует квартиры вместо частных домов - добавляется номер квартиры.

Вывод в консоли:

Адрес: Ленина 15. Спален: 3.
Площадь спальни №1: 17. Размер кровати: одинарная.
Площадь спальни №2: 22. Размер кровати: полуторная.
Площадь спальни №3: 30. Размер кровати: двойная.
Адрес: Пушкина 343-15. Спален: 2.
Ответить

Показать все комментарии