Абстрактный класс и метод в Java
Абстрактный класс — это специальный класс в Java, он не может быть создан и поэтому не может быть использован напрямую. На первый взгляд понятия абстракции, абстрактного класса и интерфейса выглядят бесполезными для многих разработчиков, потому что вы не можете реализовать ни один метод в интерфейсе и не можете создать объект абстрактного класса.
Так зачем же они вам нужны? Как только программисты сталкиваются с самой большой константой разработки программного обеспечения, , они понимают, как абстракция на верхнем уровне может помочь в написании гибкого программного обеспечения.
Ключевая задача при написании программного обеспечения (Java-программы, C++ — программы) заключается не только в удовлетворении сегодняшних требований, но и в обеспечении того, чтобы требования будущих обновлений могли быть обработаны без каких-либо архитектурных или конструктивных изменений в вашем коде. Короче говоря, ваше программное обеспечение должно быть достаточно гибким, чтобы поддерживать будущие изменения.
На самом деле это один из самых полезных принципов проектирования, также известный как «Программирование для интерфейсов, а не реализация». Абстрактный класс и абстрактный метод-это два способа, с помощью которых Java помогает вам кодировать на определенном уровне абстракции.
Где используется абстрактный класс в Java?
Помимо обычного использования абстрактного класса для написания гибкого кода, существует несколько разумных применений абстрактного класса, которые обеспечивают соблюдение определенных лучших практик. Например, вы не можете создать объект абстрактного класса. Если вы это сделаете, компилятор отметит ошибку.
Одно из умных применений абстрактного класса — это его использование в сочетании с шаблоном фабричного метода, чтобы ваш клиент всегда использовал фабричный метод для создания экземпляра объекта, а не случайно вызывал конструктор.
Делая класс продукта абстрактным, компилятор будет отслеживать любой вызов newProduct() и заставлять их использовать фабричные методы, такие как makeProduct() или getProduct(). Одним из лучших примеров этой техники является класс EnumSet в JDK, в отличие от других реализаций интерфейса Set, EnumSet является абстрактным, что гарантирует, что вы всегда используете заводские методы, такие как EnumSet.of (), вместо того чтобы делать новый EnumSet().
Всегда помните, что компилятор — ваш лучший друг, он находит ошибки для вас, Поэтому полностью используйте своего лучшего друга. Лучшая практика может быть забыта, но правило, применяемое компилятором, никогда не будет забыто.
Почему абстрактный класс важен в Java?
Существует большая разница между абстрактным классом и интерфейсом, главное, что нужно помнить, — это то, что они оба обеспечивают абстракцию. Давайте возьмем пример, вам нужно разработать программу, которая может создавать отчеты для сотрудников, например, сколько часов они работали и сколько им платят каждый месяц.
Предположим, что в настоящее время в вашей организации есть только постоянные сотрудники, которым ежемесячно выплачивается зарплата. Вы знаете это и пишете код, основанный на этом, но ваша компания начала набирать контрактных сотрудников, которым платят почасовую, а не ежемесячную зарплату. Теперь, если вам нужно переписать свою программу, чтобы поддержать это, они ваша программа недостаточно гибка.
С другой стороны, если вам просто нужно написать какой-то код, чтобы подключить этот новый тип сотрудников к системе, то ваша программа очень гибкая и ремонтопригодная. Если бы вы знали об абстрактном классе, вы бы сделали Employee абстрактным классом и такими методами, как salary() abstract, потому что это то, что варьируется между различными типами сотрудников.
Теперь введение нового типа сотрудника было бы просто прогулкой по торту, все, что вам нужно сделать, это создать еще один подкласс Сотрудника, представляющий контрактного работника, и их метод заработной платы возвращает зарплату, основанную на количестве часов, которые они проработали, умноженном на их почасовую ставку.
Итак, вы правильно поняли идею, мы кодируем на определенном уровне абстракции, что позволяет нам приспосабливаться к новым изменениям в нашей системе.
Пример абстрактного класса и метода в Java
Давайте посмотрим еще один пример абстрактного класса и метода. Все, что вы делаете, вы берете фрукты, моете их, а затем либо режете их, либо очищаете от кожуры перед едой. Наш пример основан на этом поведении. Мы создали абстрактный класс Fruit, который содержит некоторые конкретные признаки, такие как цвет, будь то сезонный фрукт или нет, и абстрактное поведение, называемое prepare().
Для того, чтобы подавать фрукты, нам нужно подготовить их к употреблению, что включает в себя либо нарезку их ломтиками, либо очистку от кожуры. У нас есть две конкретные реализации фруктового класса, Манго и Банан. Я выбрал эти два, потому что, у них разные методы их приготовления. Вы режете манго, но чистите бананы.
importjava.awt.Color;
importjava.util.ArrayList;
importjava.util.Collection;
importjava.util.List;
public class AbstractClassDemo{public static void main(String args[]) {
Fruit mango = new Mango(Color.YELLOW, true); // манго сезонное Fruit banana = new Banana(Color.YELLOW, false); // банан не является сезонным
List<Fruit> platter = new ArrayList<Fruit>();
platter.add(mango);
platter.add(banana);
serve(platter);
}public static void serve(Collection<Fruit> fruits) {
System.out.println(«Подготовка фруктов к подаче»);
for (Fruit f : fruits) {
f.prepare();
}
}
}/*
* Абстрактный класс для представления фруктов, определенный только существенным
* свойства фруктов здесь и делают вещи абстрактными, которые
* отличается для разных фруктов.
*/
abstract class Fruit {
private Color color;
privateboolean seasonal;public Fruit(Color color, boolean seasonal) {
this.color = color;
this.seasonal = seasonal;
}/*
* Это абстрактный метод, видите ли, у него нет тела метода, только объявление
*/
public abstract void prepare();public Color getColor() {
return color;
}publicbooleanisSeasonal() {
return seasonal;
}
}/*
* Конкретный класс для расширения Фруктов, так как Манго-Это Фрукт
* расширение Плода оправдано.он обладает всеми свойствами
фрукта и определяет, как готовить манго к употреблению.
*/
class Mango extends Fruit {public Mango(Color color, boolean seasonal) {
super(color, seasonal);
}@Override
public void prepare() {
System.out.println(«Порежьте манго»);
}
}/*
* Еще один конкретный класс для расширения фруктов.
*/
class Banana extends Fruit {public Banana(Color color, boolean seasonal) {
super(color, seasonal);
// TODO Автоматически сгенерированная заглушка конструктора
}public void prepare() {
System.out.println(«Очистите банан от кожуры «);
}
}Output:
Подготовить фрукты для подачи
Порежьте манго
Очистите банан от кожуры
Заключение
Помните, что абстракция очень важна для проектирования гибких систем. Гибкость достигается за счет использования интерфейсов и абстрактных классов на верхнем уровне и использования наследования и полиморфизма для предоставления различных реализаций без изменения кода, который их использует.