Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






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

Центральными в ООП являютсядва важных понятия – объект и класс. Различие между ними следующее. Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности (объекта). Фактически он описывает устройство объекта, являясь своего рода чертежом. Экземпляр класса - это объект. Объект - это совокупность данных (свойств) и функций (методов) для их обработки.

Абстрактный класс в объектно-ориентированном программировании — базовый класс, который не предполагает создания экземпляров. Абстрактные классы реализуют на практике один из принципов ООП - полиморфизм. Абстрактный класс может содержать абстрактные методы и свойства. Абстрактный метод не реализуется для класса, в котором описан, однако должен быть реализован для его неабстрактных потомков. Абстрактные классы представляют собой наиболее общие абстракции, то есть имеющие наибольший объем и наименьшее содержание.

Интерфе́йс — семантическая и синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых классом или компонентом. Можно заметить, что интерфейс, с точки зрения реализации, — это просто чистый абстрактный класс, то есть класс, в котором не определено ничего, кроме абстрактных методов. Так как в Java запрещено множественное наследование классов этот запрет обходится с помощью интерфейсов. Интерфейсы допускают множественное наследование. Один класс при этом может удовлетворять нескольким интерфейсам сразу. В этом состоит серьезное отличие интерфейсов от обычных классов и от абстрактных классов. Интерфейсы не порождают проблем с множественным наследованием, поскольку они не содержат полей. Наследование интерфейсов действительно очень гибкое. Так, если есть два интерфейса A и B, причем B наследуется от A, то новый интерфейс C может наследоваться от них обоих. Указание наследования от A является избыточным, все элементы этого интерфейса и так будут получены по наследству через интерфейс B.

Рассмотрим средства Java для определения и использования интерфейсов.

Оператор interface.Определение интерфейса сходно с определением класса, отличие со­стоит в том, что в интерфейсе отсутствуют объявления данных и кон­структоров. Общая форма интерфейса приведена ниже:

interface имя {

типРезультата имяМетода(список параметров);

тип имяFinal-переменной = значение;

}

Оператор implements. Это дополнение к определению класса, реали­зующего некоторый интерфейс(ы). Используется в объявлении класса:

class имяКласса [extends суперкласс]

[implements интерфейс0 [, интерфейс1...]] { тело класса }

Если в классе реализуется несколько интерфейсов, то их имена раз­деляются запятыми.

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

Пример 1содержит интерфейс для совместно используемых разными классами констант:

 

package My_Lab;

import java.util.Random;

//интерфейс для описания набора констант,

//общих для двух классов - Question и AskMe

interface SharedConstants {

intNO = 0;

intYES = 1;

intMAYBE = 2;

intLATER = 3;

intSOON = 4;

intNEVER = 5;

}

//класс Question

class Question implements SharedConstants {

Random rand = new Random();

int ask() {

int prob = (int) (100 * rand.nextDouble());

if (prob < 30) returnNO; // 30%

elseif (prob < 60) returnYES; // 30%

elseif (prob < 75) returnLATER; // 15%

elseif (prob < 98) returnSOON; // 13%

elsereturnNEVER; // 2%

}

}

//класс - AskMe

class AskMe implements SharedConstants {

staticvoid answer(int result) {

switch(result) {

caseNO:

System.out.println("No");

break;

caseYES:

System.out.println("Yes");

break;

caseMAYBE:

System.out.println("Maybe");

break;

caseLATER:

System.out.println("Later");

break;

caseSOON:

System.out.println("Soon");

break;

caseNEVER:

System.out.println("Never");

break;

}

}

}

 

//основной класс, создаваемый в проекте

publicclass myInterface {

 

publicstaticvoid main(String[] args) {

System.out.println("При каждом запуске выводит случ. набор слов:");

Question question = new Question();

AskMe askMe = new AskMe();

askMe.answer(q.ask());

askMe.answer(q.ask());

askMe.answer(q.ask());

askMe.answer(q.ask());

askMe.answer(q.ask());

askMe.answer(q.ask());

askMe.answer(q.ask());

}

 

}

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

При каждом запуске выводит случ. набор слов:

Later

Yes

Later

Soon

Later

Yes

No

Замените в программе английские слова произвольными русскими.

 

Пример 2. Содержит абстрактный класс и интерфейс с четырьмя методами.

В Java-проекте этого примера реализован интерфейс и четыре класса. Первыйиз них (Main) является главным классом приложения, в нем реализован метод Main, который является точкой входа в программу, а так же в нем создаются объекты двух других классов. Интерфейс IShape содержит четыре метода для вычисления и получения площади и периметра фигуры. В программе так же реализован абстрактный класс Figure, в которой определенны поля для каждой из фигур, поле площади фигуры и поле периметра фигуры.

На основе интерфейса и абстрактного класс реализованы два класса фигур (окружность и прямоугольник). Класс Circle реализовует методы интерфейса для расчета площади фигуры и её периметра, данный класс наследует класс Figure, так же в классе переопределен метод toString().

Класс Rectangle так же реализует методы интерфейса для расчета площади фигуры и её периметра, данный класс наследует класс Figure, так же в классе переопределен метод toString().

В главном классе продемонстрировано создание объектов этого класса, а так же продемонстрирован вызов методов объектов и результаты их работы. Ниже Вы можете ознакомится с исходным кодом этих классов.

 

Исходный код интерфейса (создать, используяNew --> Interface):

publicinterface IShape {

publicdouble getSquare();

publicvoid calculateSquare();//вычислитьплощадьфигуры

publicdouble getPerimeter();

publicvoid calculatePerimeter();//вычислитьпериметрфигуры

}

 

Исходный код абстрактного класса (создать, используяNew --> Class) :

// абстрактный класс, будет иметь несколько наследников

publicabstractclass Figure {

protecteddoublesquare;

protecteddoubleperimeter;

}

 

Исходныйкодкласса Circle (создать, используяNew --> Class) :

//Создадимпервогонаследникаот Figure

publicclass Circle extends Figure implements IShape {

privatedoubleradius;

 

public Circle(double radius) {

this.radius = radius;

}

 

publicdouble getSquare() {

this.calculateSquare();

returnthis.square;

}

 

publicvoid calculateSquare() {

this.square = Math.PI * Math.sqrt(radius);

}

 

publicdouble getPerimeter() {

calculatePerimeter();

returnthis.perimeter;

}

 

publicvoid calculatePerimeter() {

this.perimeter = 2 * Math.PI * radius;

}

 

public String toString() {

return"Параметрыэтойокружности: Площадь = " + this.square + ",

Периметр = " + this.perimeter;

}

}

 

Исходныйкодкласса Rectangle (создать, используяNew --> Class) :

//Создадимвторогонаследникаот Figure

publicclass Rectangle extends Figure implements IShape {

privatedoublea;

privatedoubleb;

 

public Rectangle(double a, double b) {

this.a = a;

this.b = b;

}

 

publicdouble getSquare() {

this.calculateSquare();

returnthis.square;

}

 

publicvoid calculateSquare() {

this.square = a * b;

}

 

publicdouble getPerimeter() {

calculatePerimeter();

returnthis.perimeter;

}

 

publicvoid calculatePerimeter() {

this.perimeter = 2 * a + 2 * b;

}

 

public String toString() {

return"Параметры этого прямоугольника: Площадь = " +

this.square + ", Периметр = " + this.perimeter;

}

}

 

Запускающий класс Main(создать, используяNew --> Class) :

publicclass Main {

publicstaticvoid main(String[] args) {

System.out.println("Пример на интерфейс и абстрактный класс");

System.out.println("ОКРУЖНОСТЬ и ПРЯМОУГОЛЬНИК - наследники абстрактного класса ФИГУРА");

System.out.println("У ОКРУЖНОСТи и ПРЯМОУГОЛЬНИКа общий интерфейс - периметр, площадь");

System.out.println();

 

System.out.println("Создаём экземпляр объекта - ОКРУЖНОСТЬ с радиусом 2.5");

Circle circle = new Circle(2.5);

circle.calculatePerimeter();// вычислитьпериметр

circle.calculateSquare();// вычислитьплощадь

System.out.println("Результатвыполненияметодовобъекта circle");

System.out.println(circle.toString());//выводрезультатов

System.out.println();

 

System.out.println("Создаём экземпляр объекта2- ПРЯМОУГОЛЬНИК со сторонами 2 и 3");

Rectangle rectangle = new Rectangle(2, 3);

rectangle.calculatePerimeter();// вычислитьпериметр

rectangle.calculateSquare();// вычислитьплощадь

System.out.println("Результатвыполненияметодовобъекта rectangle");

System.out.println(rectangle.toString());//выводрезультатов

}

}

 

Результат работы программы:

Пример на интерфейс и абстрактный класс

ОКРУЖНОСТЬ и ПРЯМОУГОЛЬНИК - наследники абстрактного класса ФИГУРА

У ОКРУЖНОСТи и ПРЯМОУГОЛЬНИКа общий интерфейс - периметр, площадь

 

Создаём экземпляр Circle - ОКРУЖНОСТЬ с радиусом 2.5

Результат выполнения методов объекта circle

Параметры этой окружности: Площадь = 4.967294132898051, Периметр = 15.707963267948966

 

Создаём экземпляр Rectangle - ПРЯМОУГОЛЬНИК со сторонами 2 и 3

Результат выполнения методов объекта rectangle

Параметры этого прямоугольника: Площадь = 6.0, Периметр = 10.0

 

Отладьте программу примера 2.

 

Задание 1 (для самостоятельной работы). Добавьте в проект примера 2 класс ТРАПЕЦИЯ для вычисления периметра и площади трапеции. Он должен быть третьим наследником класса Figure. Отладьте добавленный класс с разными входными данными.

 

Пакеты и области видимости

Пакеты

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

Каждый пакет имеет имя. Имя представляет собой обычный идентификатор Java. Особенность заключается в том, что это имя одновременно является названием папки, в которой хранятся файлы классов, входящие в пакет. А точка в имени преобразуется в разделитель имен файловой системы. То есть пакет с именем java.util будет представлен папкой util, находящейся внутри папки java.

В папке хранятся файлы с расширением .java, содержащие описания классов, входящих в пакет. В начале такого файла должен стоять оператор package, после которого записывается имя пакета.

Импортирование пакетов

Полное имя класса состоит из идентификатора, указанного после ключевого слова class и предшествующего ему имени пакета, в котором этот класс находится. Например, классы Circle и Rectangle описанные в пакетеlab5 имеют полные имена lab5.Circle и lab5.Rectangle.

Если классы находятся в разных пакетах, для обращения друг к другу они должны пользоваться полными именами. Это ограничение можно обойти, если импортировать нужный класс из другого пакета. Для импортирования класса используется ключевое слово import, после которого указывается его полное имя. Например, можно импортировать класс Circle из пакета lab5:

import lab5.Circle;

Задание 2. Создайте в текущем проекте новый пакет, например, lab5_1. В новом пакете создайте класс и импортируйте в него один – два класса из пакета lab5. Обратитесь к методам импортированного класса. Структура нового класса примерно должна выглядеть вот так:

 

packagelab5_1;

importlab5.Circle;//импорт класса Circle из другого пакета lab5

publicclass samoilovaimport {

publicstaticvoid main(String[] args) {

Circle mycircle = new Circle(6.5);

mycircle.calculatePerimeter();// вычислитьпериметр

mycircle.calculateSquare();// вычислитьплощадь

System.out.println("Результатвыполненияметодовкласса Circle:");

System.out.println(mycircle.toString());//выводрезультатов

}

}

 

Отладьте созданный вами класс.

Последнее изменение этой страницы: 2016-07-23

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...