Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Т_05_ Абстрактные классы и интерфейсы_JAVA.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
129.54 Кб
Скачать

JAVA Тема_05_АБСТРАКТНЫЕ БАЗОВЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ JAVA. Комличенко В.Н.

Т

Цель:

Эффективное использование особенностей представления виртуальных сущностей для разработки приложений в JAVA.

Основные задачи:

  • Ознакомиться с соответствующими языковыми конструкциями;

  • Изучить особенности их применения;

Освоить использование абстрактных классов и интерфейсов для решения практических задач на JAVA

Содержание:

  • Абстрактные классы;

  • Абстрактные методы;

  • Интерфейсы JAVA;

  • Пример использования.

ема_05 : АБСТРАКТНЫЕ БАЗОВЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
JAVA

  1. Абстрактные классы;

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

  1. Абстрактные методы;

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

Абстрактные методы объявляются при помощи ключевого слова abstract следующим образом:

abstract void my_f1();

Тело метода определяется в подклассах (конструкторы и статические методы не могут определяться как abstract).

Абстрактные методы удобно использовать если необходимо, чтобы некоторый метод присутствовал во всех классах, но во всех классах имел разную реализацию. Например, у нас может быть много типов работников (директора, программисты, бухгалтера, ...), и все классы для этих типов являются потомками базового класса worker (в классе worker описаны общие атрибуты такие как: возраст, имя, телефон и т. п., поэтому дублировать их во всех классах нет смысла). Но некоторые методы должны работать по-разному. Например, это может быть метод setSalary() для начисления зарплаты. Для работников с почасовой системой оплаты способ будет один, для совместителей - другой, для постоянных работников - третий.

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

Пример:

abstract class worker //абстрактный класс

{ protected int Age;

public String Name;

abstract public void setSalary(int newSalary);

}

class boss extends worker //потомок абстрактного (базововго) класса

{ //Пишем реализацию абстрактного метода родительского класса

public void setSalary(int newSalary)

{

if(newSalary>=0)

Salary=newSalary;

else

Salary=3000;

}

//... другие элементы класса

}

class еngineer extends worker //потомок абстрактного класса

{ //Пишем реализацию абстрактного метода родительского класса

public void setSalary(int newSalary)

{ if(newAge>=0)

Salary=newSalary;

else

Salary=2500;

}

}

Здесь объявлен класс worker, написали в нем абстрактный метод setSalary, и объявили два класса-потомка класса worker - классы boss и еngineer. В каждым из их мы пишем свою реализацию для метода setSalary.

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

abstract class worker

Экземпляры абстрактного классы создаваться не могут, но можно объявить объектную ссылку на данный класс. Это позволяет осуществлять полиморфную организации работы с массивами или списками объектов производных классов, для которых, например, как для окон на экране дисплея, необходимо регулярно выполнять определенные методы (например, перерисовывать окна). Суть в том, что можно объектную ссылку родительского класса установить на реальный экземпляр класса потомка (аналог в С++ установить указатель базового класса на объект производного) и осуществлять вызовы методов, представленных в базовом классе как абстрактные, для экземпляров объектов производных классов:

worker bigBoss=new boss(); //Это же можно записать и следующим образом:

worker bigBoss; boss в1=new boss(); bigBoss= в1;

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

Методы final могут объявляться как окончательные, не подлежащие дальнейшему переопределению (наследованию) при помощи ключевого слова final:

final void my_f1(){.....}

Если в методе не указан тип возвращаемого значения void (нет возвращаемого значения), то тип возвращаемого значения оператором return (должен совпадать с типом, который указан в объявлении метода). Ключевое слово final нельзя использовать для абстрактных методов.

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

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

В методах можно использовать помеченные операторы (Label:), переходы на которые используются в операторах ветвления break и continue (break Label;), например, чтобы выйти из множества вложенных блоков.