Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_02.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
278.09 Кб
Скачать

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

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

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

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

abstract void my_f1();

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

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

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

Пример:

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, и записать в него всех работников — и инженеров, и директоров и простых работников.

10.Интерфейсы java.

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

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

Формальное определение :

Модификатор_доступа имя _интерфейса {

тип_возвращаемого_знач имя_метода1(список_параметров);

тип_возвращаемого_знач имя_метода2(список_параметров);

тип имя_final_переменной1=значение;

тип имя_final_переменной2=значение;

//……………………………………………………….

тип_возвращаемого_знач имя_метода1N(список_параметров);

тип имя_final_переменнойN=значение;

}

Интерфейсы имеют следующие ограничения:

- Модификатор_доступа — могут быть только public или не используется (тогда, по-умолчанию, интерфейс доступен только членам пакета, в котором он объявлен).

- Методы — могут быть только абстрактными методами;

- поля — final, static (константы, не меняющие значений, такие спецификации для них назначаются автоматически, должны быть инициализированы постоянными значениями);

- сами интерфейсы — не могут иметь реализации методов.

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

Интерфейс может расширять (наследовать) другие интерфейсы. Наследуются все методы и статические константы суперинтерфейса.

В этом случае синтаксис интерфейса объявляется следующей формулой:

модификатор interface имя_интерфейса extends список_интерфейсов.

Например:

interface A extends B {

public void f1(int a1);

}

Интерфейсы не могут расширять классы (наследовать от классов).

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

Реализация методов интерфейсов в классах должна быть объявлена со специализацией public.

Если класс реализует два интерфейса, реализующие один и тот же метод, то пользователи любого интерфейса будут использовать один и тот же метод.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]