Что такое абстрактные классы java
Перейти к содержимому

Что такое абстрактные классы java

  • автор:

Абстрактные классы и методы

Абстрактные методы – это методы у которых отсутствует реализация.

аbstract тип имяМетода(списокПараметоров); 
public abstract double calculateArea();

Абстрактные методы должны быть обязательно переопределены в подклассе.

Любой класс, содержащий один или больше абстрактных методов, должен быть также объявлен как абстрактный. Для этого достаточно указать ключевое слово abstract перед ключевым словом class в начале объявления класса:

public abstract class Figure2

У абстрактного класса в Java не может быть никаких объектов. Но абстрактные классы можно применять для создания ссылок на объекты. Например:

public abstract class Figure2 < . public abstract double calculateArea(); public static void main(String[] args) < // У абстрактного класса не может быть никаких объектов. // Figure2 figure1 = new Figure2(); // Но абстрактные классы можно применять для создания ссылок на объекты. Figure2 figure2 = new Rectangle(); >>

Также нельзя объявлять абстрактные конструкторы или абстрактные статические методы.

Рассмотрим пример использования абстрактных классов и методов на примере класса Figure и его наследников Triangle и Rectangle , которые мы рассматривали в Переопределение методов. Класс Figure описывает абстрактную фигуру, для которой вычисление площади не имеет смысла, поэтому метод calculateArea() более правильно сделать абстрактным.

Абстрактные классы в Java фото

public abstract class Figure2 < double dimension1; double dimension2; public Figure2(double dimension1, double dimension2) < this.dimension1 = dimension1; this.dimension2 = dimension2; >public abstract double calculateArea(); >

Любой подкласс, производный от абстрактного класса, должен реализовать все абстрактные методы из своего супер класса или же сам быть объявлен абстрактным:

public class Rectangle2 extends Figure2 < public Rectangle2(double dimension1, double dimension2) < super(dimension1, dimension2); >public double calculateArea() < System.out.println("B области четырехугольника."); return dimension1 * dimension2; >>
public class Triangle2 extends Figure2 < public Triangle2(double dimension1, double dimension2) < super(dimension1, dimension2); >public double calculateArea() < System.out.println("B области треугольника."); return dimension1 * dimension2 / 2; >>

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

public class FindAreas < public static void main(String[] args) < Figure[] figures = new Figure[3]; figures[0] = new Figure(10, 10); figures[1] = new Rectangle(10, 10); figures[2] = new Triangle(10, 10); for (Figure figure : figures) < double area = figure.caclulateArea(); System.out.println(area); >> >

Результат выполнения программы:

B области четырехугольника. 200.0 B области четырехугольника. 100.0 B области треугольника. 50.0
  • Процедурное и объектно-ориентированное программирование
  • Принципы ООП
  • Классы и объекты
  • Конструктор
  • Ключевое слово this
  • Перегрузка
  • Стек и куча
  • Передача объектов в методы
  • Java varargs
  • Рекурсия
  • Сборщик мусора и метод finalize
  • Наследование
  • Ключевое слово super
  • Модификаторы доступа
  • Геттеры и сеттеры
  • Переопределение методов
  • Ключевое слово final
  • Задания

Что такое абстрактные классы java

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

При определении абстрактных классов используется ключевое слово abstract :

public abstract class Human < private String name; public String getName() < return name; >>

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

Human h = new Human();

Кроме обычных методов абстрактный класс может содержать абстрактные методы . Такие методы определяются с помощью ключевого слова abstract и не имеют никакой реализации:

public abstract void display();

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

Зачем нужны абстрактные классы? Допустим, мы делаем программу для обслуживания банковских операций и определяем в ней три класса: Person, который описывает человека, Employee, который описывает банковского служащего, и класс Client, который представляет клиента банка. Очевидно, что классы Employee и Client будут производными от класса Person, так как оба класса имеют некоторые общие поля и методы. И так как все объекты будут представлять либо сотрудника, либо клиента банка, то напрямую мы от класса Person создавать объекты не будем. Поэтому имеет смысл сделать его абстрактным.

public class Program < public static void main(String[] args) < Employee sam = new Employee("Sam", "Leman Brothers"); sam.display(); Client bob = new Client("Bob", "Leman Brothers"); bob.display(); >> abstract class Person < private String name; public String getName() < return name; >public Person(String name) < this.name=name; >public abstract void display(); > class Employee extends Person < private String bank; public Employee(String name, String company) < super(name); this.bank = company; >public void display() < System.out.printf("Employee Name: %s \t Bank: %s \n", super.getName(), bank); >> class Client extends Person < private String bank; public Client(String name, String company) < super(name); this.bank = company; >public void display() < System.out.printf("Client Name: %s \t Bank: %s \n", super.getName(), bank); >>

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

// абстрактный класс фигуры abstract class Figure < float x; // x-координата точки float y; // y-координата точки Figure(float x, float y)< this.x=x; this.y=y; >// абстрактный метод для получения периметра public abstract float getPerimeter(); // абстрактный метод для получения площади public abstract float getArea(); > // производный класс прямоугольника class Rectangle extends Figure < private float width; private float height; // конструктор с обращением к конструктору класса Figure Rectangle(float x, float y, float width, float height)< super(x,y); this.width = width; this.height = height; >public float getPerimeter() < return width * 2 + height * 2; >public float getArea() < return width * height; >>

#16 – Абстрактные классы и методы

#16 – Абстрактные классы и методы

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

Видеоурок

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

Для создания абстрактного классов используется ключевое слово abstract :

public abstract class Person < private float height; private String name; // Нет никакой реализации, лишь описание методов public float getHeight() < return height; >public abstract String getName(); >

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

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

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

Весь код будет доступен после подписки на проект!

Абстрактные классы и методы

Класс, содержащий абстрактные методы, называется абстрактным классом. Такие классы помечаются ключевым словом abstract.

Абстрактный метод не завершён. Он состоит только из объявления и не имеет тела:

abstract void yourMethod();

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

Если вы объявляете класс, производный от абстрактного класса, но хотите иметь возможность создания объектов нового типа, вам придётся предоставить определения для всех абстрактных методов базового класса. Если этого не сделать, производный класс тоже останется абстрактным, и компилятор заставит пометить новый класс ключевым словом abstract.

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

В тоже время абстрактный класс не обязательно должен иметь только абстрактные методы. Напомню ещё раз, что если класс содержит хотя бы один абстрактный метод, то он обязан быть сам абстрактным.

Создавать объект на основе абстрактного класса нельзя.

 // нельзя. даже не пытайтесь AbstractClass abstractClass = new AbstractClass(); 

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

Я вернулся. Давайте напишем пример для абстрактного класса.

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

 package ru.alexanderklimov.expresscourse; public abstract class SphericalHorse < // абстрактный метод ржать() abstract void neigh(); // абстрактный класс может содержать и обычный метод void gallop() < System.out.println("Куда прёшь?"); >> class SphericalHorseInVacuum extends SphericalHorse

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

Abstract

Abstract

Соглашаемся и дописываем в созданную заготовку свой код для метода.

 @Override void neigh()

В главной активности напишем код для щелчка кнопки.

 public void onClick(View view) < SphericalHorseInVacuum horse = new SphericalHorseInVacuum(); horse.neigh(); // на основе абстрактного метода horse.gallop(); // обычный метод >

Обратите внимание, что абстрактный класс может содержать не только абстрактные, но и обычные методы.

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

 // абстрактный класс Фигура abstract class Figure < double dim1; double dim2; Figure(double a, double b) < dim1 = a; dim2 = b; >// абстрактный метод для вычисления площади abstract double area(); > // Клас Треугольник class Triangle extends Figure < Triangle(double a, double b) < super(a, b); >// переопределяем метод double area() < return dim1 * dim2 / 2; >> // В активности public void onClick(View view) < // Figure figure = new Figure(10, 10); // так нельзя Triangle triangle = new Triangle(10, 8); Figure figure; // так можно, так как объект мы не создаем figure = triangle; mInfoTextView.append("Площадь равна " + figure.area()); >

Фигура — это абстрактное понятие и мы не можем создать универсальный метод для вычисления площади. Поэтому мы создаём другой класс Треугольник и пишем код, вычисляющий площадь треугольника (загляните в учебник геометрии). Также вы можете создать новый класс Прямоугольник и написать свой код для вычисления площади этой фигуры.

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

Кот — понятие тоже абстрактное. А вот ваш любимец Васька или Мурзик уже конкретный шерстяной засранец. По запросу «abstract cat» мне выдало такую картинку. Всегда интересовал вопрос, где художники берут такую травку? (это был абстрактный вопрос).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *