4.3 Абстрактные классы
Модификатор 'abstract' может применяться к классам и методам.
4.3.1 Почему мы используем абстрактные классы?
Иногда может произойти ситуация, когда мы должны определить суперкласс, в котором может объявляться структура для его подклассов, но не можем создать значащее выполнение для метода. То есть иногда нам требуется создать суперкласс, который определяет только обобщенную форму, разделённую всеми ее подклассами, оставляя это к каждому подклассу, чтобы заполниться в деталях. Такой класс определяет характер методов, которые подклассы должны осуществить.
Абстрактный класс определен, чтобы дать обобщенную форму, которая может быть разделена ее подклассами.
Таким образом подклассы согласно их потребности расширяют этот абстрактный класс и используют методы, объявленные со своим собственным настроенным выполнением метода.
4.3.2 Абстрактный метод
Абстрактный метод указывает, что выполнение метода должно быть обеспечено в подклассе данного абстрактного класса.
Рассмотрите иерархию класса, показанного на рисунке:
Рисунок 4.4: Иерархия
Проектировщик класса, Animal решил, что каждый подкласс должен иметь метод travel О(путешествовать). Каждый подкласс имеет свой собственный уникальный способ путешествовать, так что не возможно обеспечить, метод travel () в суперклассе и чтобы каждый подкласс унаследовал одну и ту же родительскую версию. Вместо этого, суперкласс Animal объявляет метод travel (), чтобы быть абстрактным. Декларация напоминает это:
abstract void travel();
В конце строки кода - точка с запятой, где мы ожидали бы найти фигурные скобки, содержащие тело метода. Тело метода - это его выполнение - относится к подклассам. Суперкласс только обеспечивает название метода и подпись. Любой подкласс Animal должен обеспечить выполнение метода travel () или объявить себя абстрактным.
4.3.3 Абстрактный класс
Если класс абстрактный, то это указывает на то, что класс не может быть реализован. Если класс содержит один или больше абстрактных методов, то компилятор настаивает, чтобы класс был объявлен как abstract. Это - большое удобство людям, которые будут использовать класс: они должны смотреть только в одном месте (в объявлении класса), чтобы узнать, позволено ли им непосредственно реализовать класс или они должны создавать подкласс.
Класс становится абстрактным:
Когда один или более методов класса абстрактны.
Когда класс - подкласс абстрактного класса и не обеспечивает никаких деталей выполнения или тела метода по отношению к любому из абстрактных методов.
Когда класс осуществляет интерфейс и не обеспечивает детали выполнения или тела метода по отношению к любому из абстрактных методов.
В некотором смысле, абстракция (abstract) - противоположность final. Класс final, например, не может разделяться на подклассы; абстрактный класс наоборот.
Следующий код показывает пример абстрактных методов.
Пример 5:
abstract class Employee
{
int basic = 2000;
abstract void salary ();
}
class Manager extends Employee
{
void salary()
{
System, out.printIn( Salary = +basic*5);
}
}
class Worker extends Employee
{
void salary()
{
System.out.println( Salary = +basic*2);
}
}
class AbstractDemo
{
public static void main(String args [])
{
Manager m = new Manager();
System.out.println( Manager );
m. salary () ;
Worker w = new Worker();
System.out.println( Worker );
w. salary () ;
}
}
Вывод вышеупомянутой программы:
Рисунок 4.5: Вывод
В вышеупомянутой программе, метод
salary (заработок) - абстрактный метод, и следовательно класс
Employee также объявлен как abstract. Классы
Manager и
Worker унаследованные от класса
Employee, обеспечивают детальное выполнения метода
salary.