Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка Java-технологии.doc
Скачиваний:
12
Добавлен:
01.05.2019
Размер:
793.09 Кб
Скачать

Контрольні питання.

  • Назвіть основні об'єктні типи.

  • За допомогою якого методу здійснюється вивід графіки?

  • Чи можна змінити об'єкт типу String?

  • Як оголосити масив?

Завдання.

1. Напишіть додаток, що буде створювати кілька різних масивів. Багатомірний масив, 3-мірний масив фіксованої довжини, 3-мірний масив змінної довжини й масив непримітивних об'єктів.

2. Написати додаток, у якому залежно від обраної радиокнопки створюється й отрисовывается на панелі в довільному місці, що не виходить за межі панелі, крапка, окружність, квадрат або прямокутник. По натисканню на кнопки “Створити об'єкт”, “show”, “hide”, “moveTo” повинні виконуватися відповідні методи для останнього створеного об'єкта.

3.Ускладнити копію даного додатка, додавши на форму компонент із прокручивающимся списком або списком, що випадає, з іменами об'єктів. Ім'я об'єкта повинне складатися з імені, що відповідає типу, і порядкового номера (dot1, circle3 і т.п.). По натисканню на кнопки “Створити об'єкт”, “show”, “hide”, “moveTo” повинні виконуватися відповідні методи для об'єкта, виділеного в списку.

Лабораторна робота № 4.

Тема: Інтерфейси й класи.

Ціль: Одержати практичні навички при роботі з інтерфейсами та класами й навчитися виконувати з ними різні операції.

Короткі теоретичні відомості.

Інтерфейси є найважливішими елементами мов програмування, застосовуваних як для написання поліморфного коду, так і для межпрограммного обміну.

Інтерфейси є спеціальним різновидом повністю абстрактних класів. Тобто таких класів, у яких взагалі немає реалізованих методів - всі методи абстрактні. Полів даних у них також ні, але можна задавати константи (незмінні змінні класу). Клас в Java повинен бути спадкоємцем одного класу-батька, і може бути спадкоємцем довільного числа інтерфейсів. Самі інтерфейси також можуть успадковуватися від інтерфейсів, причому також з дозволом на множинне спадкування.

Відсутність в інтерфейсах полів даних і реалізованих методів знімає майже всі проблеми множинного спадкування й забезпечує витончений інструмент для написання поліморфного коду. Наприклад, те, що всі колекції мають методи, перерахованими в розділі про колекції, забезпечується тим, що їхні класи є спадкоємцями інтерфейсу Collection. Аналогічно, всі класи итераторов є спадкоємцями інтерфейсу Iterator, і т.д.

Декларація інтерфейсу дуже схожа на декларацію класу:

МодификаторВидимости interface ИмяИнтерфейса

extends ИмяИнтерфейса1, ИмяИнтерфейса2,..., Имяинтерфейса{

декларація констант;

декларація заголовків методів;

}

Для імен інтерфейсів в Java немає спеціальних правил, за винятком того, що для них, як і для інших об'єктних типів, ім'я прийняте починати із заголовної букви. Ми будемо використати для імен інтерфейсів префікс I (від слова Interface), щоб їхні імена легко відрізняти від імен класів.

Оголошення константи здійснюється майже так само, як у класі:

Модификаторвидимости Тип Имяконстанты = значення;

Як необов'язковий модифікатор видимості може використатися слово public. Або модифікатор повинен отсутствовать - але при цьому видимість також уважається public, а не пакетної. Ще однією відмінністю від декларації в класі є те, що при завданні в інтерфейсі всі поля автоматично вважаються остаточними (модифікатор final), тобто без права зміни, і до того ж є змінними класу (модифікатор static). Самі модифікатори static й final при цьому ставити не треба.

Декларація методу в інтерфейсі здійснюється дуже схоже на декларацію абстрактного методу в класі - указується тільки заголовок методу:

Модификаторвидимости Тип Имяметода(списокпараметров)

throws списокисключений;

Як модифікатор видимості, як й у попередньому випадку, може використатися або слово public, або модифікатор повинен отсутствовать. При цьому видимість також уважається public, а не пакетної. У списку виключень через кому перераховуються типи виключень, що перевіряють, (нащадки Exception) , які може збуджувати метод. Частина throws списокИсключений є необов'язковою. При завданні в інтерфейсі всі методи автоматично вважаються загальнодоступними (public) абстрактними (abstract) методами об'єктів.

Приклад завдання інтерфейсу:

package figures_pkg;

public interface IScalable {

public int getSize();

public void setSize(int newSize);

}

Клас можна успадковувати від одного батьківського класу й від довільної кількості інтерфейсів. Але замість слова extends використається зарезервоване слово implements - реалізує.

Реалізації в сутності типу інтерфейс не буває, як і для абстрактних класів. Тобто екземплярів інтерфейсів не буває. Але, як і для абстрактних класів, можна вводити змінні типу інтерфейс. Ці змінні можуть посилатися на об'єкти, що належать класам, що реалізують відповідний інтерфейс. Тобто класам-спадкоємцям цього інтерфейсу.

Правила сумісності такі: змінної типу інтерфейс можна привласнювати посилання на об'єкт будь-якого класу, що реалізує цей інтерфейс.

За допомогою змінною типу інтерфейс дозволяється викликати тільки методи, декларовані в даному інтерфейсі, а не будь-які методи даного об'єкта. Якщо, звичайно, не використати приведення типу.

Основне призначення змінних интерфейсного типу - виклик з їхньою допомогою методів, продекларированных у відповідному інтерфейсі. Якщо такий змінної призначене посилання на об'єкт, можна гарантувати, що із цього об'єкта дозволено викликати ці методи, незалежно від того, якому класу належить об'єкт. Ситуація дуже схожа з поліморфізмом на основі віртуальних і динамічних методів об'єктів. Але гарантією працездатності служить не однаковість сигнатури методів в одній ієрархії, а однаковість сигнатури методів у різних ієрархіях - завдяки збігу з декларацією того самого інтерфейсу. Обов'язково, щоб методи були методами об'єктів - поліморфізм на основі методів класу неможливий, тому що для викликів цих методів використається статичне зв'язування (на етапі компіляції).

Основні відмінності інтерфейсів від класів:

  • Не буває екземплярів типу інтерфейс, тобто екземплярів інтерфейсів, що реалізують тип інтерфейс.

  • Список елементів інтерфейсу може включати тільки методи й константи. Поля даних використати не можна.

  • Елементи інтерфейсу завжди мають тип видимості public (у тому числі без явної вказівки). Не дозволено використати модифікатори видимості крім public.

  • В інтерфейсах не буває конструкторів і деструкторів.

  • Методи не можуть мати модифікаторів abstract (хоча і є абстрактними за замовчуванням), static, native, synchronized, final, private, protected.

  • Інтерфейс, як і клас, успадковує всі методи прабатька, однак тільки на рівні абстракцій, без реалізації методів. Тобто інтерфейс успадковує тільки обов'язковість реалізації цих методів у класі, що підтримує цей інтерфейс.

  • Спадкування через інтерфейси може бути множинним. У декларації інтерфейсу можна вказати, що інтерфейс успадковується від одного або декількох прабатьківських інтерфейсів.

  • Реалізація інтерфейсу може бути тільки в класі, при цьому, якщо він не є абстрактним, те повинен реалізувати всі методи інтерфейсу.

  • Спадкування класу від інтерфейсів також може бути множинним.

Приведемо приклад абстрактного класу, що є спадкоємцем Figure, і реалізує зазначений вище інтерфейс IScalable:

package figures_pkg;

public abstract class ScalableFigure extends Figure implements IScalable {

private int size;

public int getSize() {

return size;

}

public void setSize(int size) {

this.size=size;

}

}

Як спадкоємець приведемо код класу Circle:

package figures_pkg;

import java.awt.*;

public class Circle extends ScalableFigure {

public Circle(Graphics g,Color bgColor, int r){

setGraphics(g);

setBgColor(bgColor);

setSize(r);

}

public Circle(Graphics g,Color bgColor){

setGraphics(g);

setBgColor(bgColor);

setSize( (int)Math.round(Math.random()*40) );

}

public void show(){

Color old=getGraphics().getColor();

getGraphics().setColor(Color.BLACK);

getGraphics().drawOval(get(),get(),getSize(),getSize());

getGraphics().setColor(old);

}

public void hide(){

Color old=getGraphics().getColor();

getGraphics().setColor(getBgColor());

getGraphics().drawOval(get(),get(),getSize(),getSize());

getGraphics().setColor(old);

}

};

Приведемо приклад спадкування інтерфейсом від інтерфейсу:

package figures_pkg;

public interface IStretchable extends IScalable{

double getAspectRatio();

void setAspectRatio(double aspectRatio);

int getWidth();

void setWidth(int width);

int getHeight();

void setHeight(int height);

}

До інтерфейсів застосовний як оператор instanceof, так і приведення типів. Наприклад, фрагмент коду для зміни випадковим образом розміру об'єкта за допомогою інтерфейсу IScalable може виглядати так:

Object object;

...

object= Circle(...);//конструктор створює окружність

...

if(object instanceof IScalable){

((IScalable) object).setSize( (int)(Math.random()*80) );

}

Всі дуже схоже на використання класу ScalableFigure:

Figure figure;

...

figure = Circle(...);//конструктор створює окружність

...

if( figure instanceof IScalable){

figure.hide();

((IScalable)figure).setSize((int)(Math.random()*80));

figure.show();

}