ООП в Java: понятное введение в базовые принципы

Java — это высокоуровневый язык программирования, который разработали в 1990-х годах и который до сих пор остается одним из самых популярных языков в мире. Он изначально создавался для написания программ, которые могли бы работать в любой операционной системе, потому что он работает на виртуальной машине, поддерживаемой всеми операционными системами.

Одна из главных особенностей Java является ее объектно-ориентированный подход к программированию, который значительно повышает ее популярность. ООП позволяет разделить программу на логически связанные блоки — объекты, которые могут обмениваться информацией и выполнять заданные действия. Каждый объект имеет свои свойства и методы, которые совместно определяют его поведение.

ООП в Java — это сложная тема, но попытаемся ее понять шаг за шагом. В этой статье мы разберем базовые концепции ООП в Java, как создавать классы и объекты, наследование, полиморфизм и абстракцию. Мы также рассмотрим некоторые примеры кода, чтобы было легче понять, как все это работает.

Что такое ООП?

Объектно-ориентированное программирование (ООП) — это методология программирования, основанная на понятии объектов, которые могут содержать данные и функциональность. ООП позволяет создавать модели реальных объектов и явлений, а также упрощает разработку сложных программных систем.

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

Java является языком программирования, который широко использует ООП. В Java все программы создаются в виде классов и объектов. Классы содержат свойства и методы, которые могут быть использованы для создания объектов и реализации конкретной функциональности.

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

История возникновения ООП

Появление парадигмы ООП связано с развитием компьютерной технологии и идеей, которые возникли в 60-х годах XX века. Тогда программисты столкнулись с проблемой управления большими и сложными программными проектами. Программы состояли из тысяч строк кода, и их сопровождение, изменение и обновление становилось все более трудным.

Основным принципом ООП является разбиение программы на небольшие, независимые от друг друга объекты, которые обладают собственными свойствами и методами. Это позволяет управлять сложностью кода и упрощает процесс разработки и сопровождения программы.

Первым языком, который поддерживал основные принципы ООП, стал Simula, разработанный в Норвегии в 1967 году. Он содержал концепции классов и наследования объектов, и использовался в программировании симуляции судов и других объектов. А уже в 80-х годах, проект OpenWindows включил в себя инструмент ObjectWorks, который использовал язык Smalltalk для разработки объектно-ориентированных приложений.

Java, создаваемая с конца 80-х годов XX века, на сегодняшний день представляет собой один из самых популярных объектно-ориентированных языков программирования. Он обеспечивает высокую степень переносимости кода, быстрое выполнение и высокую скорость работы программы.

ГодСобытие
1967Создание языка Simula – первого языка, который поддерживал основные принципы ООП.
1980-еИнструмент ObjectWorks, который использовал язык Smalltalk для разработки объектно-ориентированных приложений, включен в проект OpenWindows.
Конец 80-х годов XX векаСоздание языка Java, который является одним из самых популярных объектно-ориентированных языков программирования с высокой степенью переносимости кода, быстрым выполнением и высокой скоростью работы программы.

Принципы ООП

ООП, или объектно-ориентированное программирование, базируется на ряде принципов, которые определяют его основные понятия и подходы. Рассмотрим основные из них:

  • Инкапсуляция — концепция, которая позволяет ограничить доступ к внутренним данным объекта извне.
  • Наследование — возможность создавать новый класс на основе уже существующего, наследуя его свойства и функциональность.
  • Полиморфизм — способность объекта вести себя по-разному в зависимости от контекста, в котором он вызывается.
  • Абстракция — механизм, позволяющий отделить сущность от ее реализации и определить только необходимый минимум информации о ней.

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

Классы и объекты

Классы в Java — это шаблоны, описывающие состояние и поведение объектов. Класс может содержать поля, конструкторы, методы, а также другие классы (вложенные классы). Каждый объект класса создается с помощью оператора new и имеет свою уникальную копию всех полей и методов класса.

Объекты в Java — это конкретные экземпляры классов. Каждый объект имеет свои уникальные значения полей и может вызывать методы, определенные в классе, для выполнения определенных действий.

В Java объекты создаются с помощью оператора new. Например:

Person person1 = new Person();

Этот код создает экземпляр класса Person и присваивает его переменной person1.

Объекты в Java имеют свойства и методы. Свойства доступны через переменные объекта, а методы вызываются через точку. Например, если у класса Person есть свойство name и метод sayHello(), то можно вызвать их так:

person1.name = "John";

person1.sayHello();

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

Определение класса

Класс является основным понятием в объектно-ориентированном программировании (ООП). Он представляет собой шаблон или тип, по которому создаются объекты. Класс определяет свойства и методы, которые будут унаследованы всеми объектами, созданными на его основе.

Определение класса начинается с ключевого слова «class», за которым следует имя класса. Имя класса должно быть уникальным в пределах программы. Затем в фигурных скобках следует тело класса, которое может содержать объявления переменных, методов, конструкторов и других элементов.

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

При создании объекта класса используется оператор «new». Он вызывает конструктор класса, который инициализирует объект и устанавливает начальные значения его свойств.

В Java все классы наследуются от класса Object, который определяет базовые методы, такие как equals(), hashCode() и toString(). Эти методы могут быть переопределены в производных классах для удовлетворения конкретных потребностей программы.

Создание объекта

В языке программирования Java объекты создаются с помощью ключевого слова new.

Синтаксис создания объекта следующий:

ClassName objectName = new ClassName();

где ClassName — это имя класса, а objectName — имя объекта.

При создании объекта, оператор new выделяет память под объект и вызывает конструктор класса, чтобы инициализировать его.

Конструктор является специальным методом в классе, который используется для инициализации полей объекта при создании экземпляра класса. Если в классе не определен конструктор, компилятор Java создаст конструктор по умолчанию.

Пример создания объекта класса Car:

Car myCar = new Car();

В данном примере myCar является объектом класса Car.

При создании объекта можно передать аргументы в конструктор класса:

Car myCar = new Car("Nissan", "Sentra");

В этом примере конструктор класса Car принимает два аргумента — марку и модель автомобиля.

Объекты являются основными строительными блоками ООП в Java. Их создание — это одна из основных операций в ООП, которая позволяет использовать все преимущества языка Java.

Работа с объектами

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

Для работы с объектами в Java используется класс – шаблон, на основе которого создаются экземпляры. Класс определяет свойства и методы объектов соответствующего типа.

Создание объекта происходит с помощью оператора new. Например, для создания объекта класса Person используется следующий код:

Person person1 = new Person();

Переменная person1 указывает на созданный объект типа Person.

Для доступа к свойствам и методам объекта используются операторы точки. Например, для доступа к свойству name объекта person1:

String name = person1.name;

Для вызова метода sayHello() объекта person1:

person1.sayHello();

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

public void printInfo(Person person) {

// код метода

}

И метод, возвращающий объект типа Car:

public Car createCar(String brand, String model) {

// код метода

Car car = new Car(brand, model);

// код метода

return car;

}

Таким образом, работа с объектами в Java позволяет создавать более гибкие и масштабируемые приложения за счет работы с компонентами в виде отдельных сущностей.

Наследование

Наследование в Java – это механизм ООП, который позволяет создавать новые классы, наследуя свойства и методы от уже существующих. Такой класс, который наследует свойства и методы, называется подклассом (или дочерним классом), а класс, от которого наследуются свойства и методы – суперклассом (или родительским классом).

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

Наследование позволяет писать более чистый и структурированный код. Например, если у нас есть класс «Фрукты», который имеет свойства «название» и «цена», а также методы для получения и изменения этих свойств, и классы «Яблоко», «Груша» и «Апельсин», которые имеют те же свойства и методы, то мы можем создать сначала класс «Фрукты», а затем наследовать его для остальных классов. Таким образом, код будет более компактным и легким для понимания.

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

Принцип наследования

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

Наследование в Java реализуется через ключевое слово extends. Дочерний класс наследует все не-private свойства и методы родительского класса, а также может переопределять методы, унаследованные от родительского класса.

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

Пример наследования
Родительский класс:public class Animal{

String name;

int age;

public void eat(){

System.out.println(«Animal is eating»);

}

}

Дочерний класс:public class Dog extends Animal{

public void bark(){

System.out.println(«Dog is barking»);

}

}

В этом примере класс Dog наследует все свойства и методы класса Animal, а также определяет свой новый метод bark(). Теперь объект класса Dog может использовать не только метод eat() из класса Animal, но и метод bark() из своего класса.

Иерархия классов

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

Каждый класс, за исключением класса Object, может иметь только один непосредственный суперкласс. Класс, наследующий от другого класса, называется подклассом, а класс, от которого наследуется, — суперклассом.

Следует обратить внимание, что подкласс наследует все public и protected методы и свойства своего суперкласса. Private методы и свойства не наследуются и не доступны для изменения из подкласса. Подкласс также может добавлять свои собственные свойства и методы, которые не могут быть использованы в суперклассе.

Иерархия классов позволяет использовать полиморфизм, то есть использование одного интерфейса для разных классов. Например, интерфейс Animal может быть реализован разными классами: Dog, Cat, Bird и т.д. Возможность реализации интерфейса для разных классов является одним из основных принципов ООП.

Переопределение методов

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

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

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

При вызове метода из дочернего класса Java будет использовать его переопределенную реализацию, а не реализацию из родительского класса. Это позволит дополнить или изменить функционал, который был унаследован от родительского класса.

Инкапсуляция

Инкапсуляция — одна из основных концепций ООП, которая заключается в объединении данных и методов, которые с ними работают, в единый класс и скрытии реализации от внешнего мира. С помощью инкапсуляции можно обеспечить безопасность данных, т.к. доступ к ним осуществляется только через методы класса.

Для реализации инкапсуляции используются модификаторы доступа. В Java существуют четыре модификатора: private, protected, public и default, которые задают видимость данных и методов внутри и снаружи класса.

Модификатор private делает данные и методы недоступными за пределами класса. Это означает, что только методы внутри класса имеют доступ к этим данным. Модификатор protected делает данные и методы доступными только внутри класса и его наследников. Модификатор public делает данные и методы доступными для всех классов. Модификатор default, который не указывается явно, делает данные и методы доступными только внутри пакета.

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

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

Принцип инкапсуляции

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

Основной инструмент для реализации принципа инкапсуляции в Java — это модификаторы доступа. В языке Java существуют четыре модификатора доступа: private, protected, public и default. Используя эти модификаторы, можно ограничивать доступ к полям и методам класса, тем самым скрывая их от внешнего мира и обеспечивая безопасность данных.

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

Принцип инкапсуляции является фундаментальным принципом, на котором строится весь объектно-ориентированный подход. Его применение позволяет существенно повысить надежность, безопасность и эффективность программных систем.

Модификаторы доступа

Модификаторы доступа в Java являются специальными ключевыми словами, которые определяют, в каких условиях можно получить доступ к членам класса: переменным, методам и конструкторам. Они помогают обеспечить безопасность и контроль доступа к данным и функциональности объектов.

В Java есть четыре модификатора доступа:

  • public — члены класса доступны из любой части программы;
  • private — члены класса доступны только внутри класса. К коду за пределами класса они недоступны;
  • protected — члены класса доступны внутри класса и в подклассах;
  • default (по умолчанию) — члены класса доступны внутри пакета, но не доступны за его пределами.

Модификаторы доступа также могут применяться к классам и интерфейсам. В этом случае они определяют, к каким другим классам и пакетам можно получить доступ к этому классу или интерфейсу. Например, класс, объявленный с модификатором доступа protected, будет доступен только внутри пакета и в подклассах.

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

Полиморфизм

Полиморфизм — это способность объектов разных классов взаимодействовать друг с другом, используя общий интерфейс. Он позволяет использовать базовый класс для работы с производными классами.

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

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

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

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

Принцип полиморфизма

Полиморфизм — это возможность объектов одного класса проявлять себя по-разному в зависимости от контекста. В Java полиморфизм достигается за счет использования механизма наследования, а также абстрактных классов и интерфейсов.

Примером полиморфизма может служить перегрузка методов. Если у нас есть несколько методов с одним именем, но различными параметрами, то в зависимости от переданных параметров вызовется конкретная версия метода. Этот механизм называется перегрузкой методов.

Другой пример полиморфизма — переопределение методов. Если у нас есть класс-родитель с методом, то его можно переопределить в классе-наследнике. В этом случае при вызове метода у объекта-наследника будет вызываться его версия метода, а не родительская.

Очень важным аспектом полиморфизма является полиморфизм через интерфейсы. Если класс имплементирует интерфейс, то объект этого класса можно привести к типу интерфейса. Это позволяет создавать более общие абстракции и повышать гибкость программы.

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

Полиморфизм методов

Один из главных принципов ООП — полиморфизм. Полиморфизм методов — это способность объектов разных классов иметь методы с одинаковыми именами и аргументами.

В Java полиморфизм методов достигается за счет использования наследования и переопределения методов у наследников. Если в родительском классе есть метод с определенным именем и аргументами, а в классе-наследнике также есть метод с тем же именем и аргументами, то этот метод будет переопределен.

Полиморфизм методов позволяет удобно использовать один и тот же метод для разных объектов. Например, если имеется класс «Фигура», а от него наследуются классы «Круг», «Прямоугольник», «Треугольник», то для всех объектов этих классов может быть использован один и тот же метод «вычислить площадь».

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

Полиморфизм классов

Полиморфизм – это способность программы работать с объектами не только их конкретных типов, но и объектов их родительских типов. В Java полиморфизм представлен применением переопределения методов и приведением типов.

Рассмотрим пример. Пусть есть класс «Фигура», от которого наследуется класс «Круг». У нас есть метод, который принимает на вход объект класса «Фигура». Когда мы передаем в этот метод объект класса «Круг», происходит полиморфизм, то есть программа работает с объектом типа «Круг» как с объектом типа «Фигура». В результате, метод класса «Фигура» может выполнять другую логику для разных типов объектов, даже если у них нет общего метода.

Также полиморфизм может проявляться при использовании интерфейсов. Если класс реализует какой-то интерфейс, то объект этого класса может использоваться в качестве типа этого интерфейса. Это позволяет создавать универсальные методы, которые могут работать с объектами разных классов, реализующих один интерфейс.

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

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

Итак, полиморфизм – это мощный инструмент в ООП, позволяющий писать более читаемый код и делать программы более универсальными. Однако, его использование должно быть осознанным, чтобы не ухудшить производительность программы.

Абстракция

Абстракция является важным принципом объектно-ориентированного программирования в Java. Он позволяет скрыть детали реализации и сосредоточиться на функциональности объекта.

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

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

Использование абстракции можно сравнить с использованием автомобиля. Когда мы пользуемся автомобилем, мы знаем, что он может двигаться, тормозить, разгоняться и т.д., но мы не знаем, какие детали внутри машины обеспечивают все это. Аналогично, когда мы используем объекты в Java с помощью абстракции, мы знаем, какие методы доступны, но мы не знаем, как они реализованы внутри объекта.

Принцип абстракции

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

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

В Java принцип абстракции реализуется с помощью абстрактных классов и интерфейсов. Абстрактный класс – это класс, который не может быть использован для создания объектов, но может содержать абстрактные методы и свойства. Абстрактный метод – это метод, который не имеет определения и должен быть реализован в классах-наследниках. Интерфейс – это набор абстрактных методов, которые должны быть реализованы в классах, которые реализуют этот интерфейс.

Принцип абстракции является одним из принципов SOLID, которые рассматриваются в объектно-ориентированном программировании. Он помогает создавать более чистый, структурированный и поддерживаемый код.

Абстрактные классы и интерфейсы

Абстрактный класс в Java – это класс, который не может быть использован для создания объектов. Его основная задача – предоставить базовую реализацию для других классов, которые будут наследоваться от него. Абстрактный класс может содержать как реализацию методов, так и их объявления. В отличие от обычных классов, методы абстрактного класса должны быть объявлены без тела, то есть без определения.

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

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

FAQ

Что такое ООП?

ООП (объектно-ориентированное программирование) – это методология программирования, основанная на понятиях объектов, классов, наследования и инкапсуляции.

Какие преимущества имеет ООП в сравнении со структурным программированием?

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

Что такое классы и объекты в Java?

Классы являются шаблоном для создания объектов. Они определяют свойства и методы, которые могут быть использованы в объектах. Объекты — это экземпляры классов, которые могут использовать методы и свойства, определенные в классе.

Что такое наследование в Java?

Наследование в Java позволяет создавать новый класс на основе существующего. Новый класс, называемый подклассом, наследует свойства и методы существующего класса, называемого суперклассом. Подкласс может расширить функциональность суперкласса, добавив свои собственные методы и свойства.

Что такое инкапсуляция в Java?

Инкапсуляция — это механизм, который позволяет скрыть внутренние детали реализации класса от внешнего мира и обеспечить доступ к свойствам и методам только через определенные методы. Это обеспечивает защиту данных и облегчает изменение реализации класса без изменения кода, который использует этот класс.

Ссылка на основную публикацию
Adblock
detector