You are on page 1of 101

Об’єктно-орiєнтоване програмування мовою

Java, частина III


Нотатки до лекцiй

Олексiй Тихомиров

Кафедра експериментальної фiзики


Фiзичний факультет

Вересень 2013
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Спадщина

• Старий дiм ⇒ новий дiм. Чи треба зносити все?


• Спадкування дає можливiсть використовувати старий код,
що iснує.
Не вигадуйте велосипед!
Послуговуйтесь кодом, що вже написано!
• Спадкування дозволяє визначати новий клас через той, що
вже iснує
• Ключове слово extends дозволяє сказати, що новий клас
(пiдклас) буде схожий на старий (суперклас, основний
клас).
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Спадкування: новий клас та конструктор

• Визначення нового класу вказує на вiдмiну вiд основного


класу.
class ScientificBook extends Book {
String area; boolean proceeding = false; }
• Екземпляр наукової книжки буде мати шiсть дiлянок
title, author, numberOfPages, ISBN , area та proceeding ;
першi чотири є спадщиною.
• Конструктор, що посилається на суперклас, мусить
починатись зi super .
ScientificBook(String t,String at,
int nm,String isbn,String a) {
super(t,at,nm,isbn); area = a; }

• Якщо його немає, Java буде застосовувати виклик


super() без параметрiв.
Спадкування: метод. (1 з 4)

• Новий метод можна описати у новому класi, щоб


встановити або уточнити вiдповiдну поведiнку об’єкта.
• Методи суперкласу також можна викликати. Поведiнка
успадковується.
• Коли об’єкту надсилається повiдомлення, JVM починає
пошук з вiдповiдного методу з поточного класу i далi по
iєрархiї знизу догори допоки метод не буде знайдено.
Спадкування: метод. (2 з 4)

• Деякi методи можна застосувати без змiн:


ScientificBook sb;
sb = new ScientificBook("Neural Networks, "+
"A Comprehensive Foundation",
"Simon Haykin",696,"0-02-352761-7",
"Artificial Intelligence");
System.out.println(sb.getInitials());

• Програма надрукує:
S.H.
Спадкування: метод. (3 з 4)

• Новий метод може також викликати методи базового класу

class ScientificBook extends Book {


String area;
boolean proceeding = false;
ScientificBook(String tit,String aut,int num,
String isbn, String a) {
super(tit,aut,num,isbn);
area = a;
}
public boolean equals(ScientificBook b) {
return super.equals(b) && area.equals(b.area)
&& proceeding == b.proceeding;
}
}
Спадкування: метод. (4 з 4)

• Не обов’язково викликати метод суперкласу. Можна


написати метод незалежно вiд того, яку поведiнку
закладає метод суперкласу.
public static String description() {
return "ScientificBook instances can store "+
"information on scientific books";
}

• Можна визначити повнiстю новий метод.


public void setProceeding() {proceeding = true;}
public boolean isProceeding() {return proceeding;}

• Позначте, що можна надiслати повiдомлення setProceeding


тiльки екземплярам класу ScientificBook.
Методи Instanceof getClass

• Розглянемо програму
class TestClass {public static void main(String[] args) {
Book b1=new Book("Thinking in Java","Bruce Eckel",1129);
ScientificBook sb1=new ScientificBook("Neural Networks,"
+" A Comprehensive Foundation","Simon Haykin",696,
"0-02-352761-7","Artificial Intelligence");
System.out.print(b1.getClass().getName()+" ");
System.out.print(sb1.getClass().getName()+" ");
System.out.print(b1 instanceof Book+" ");
System.out.print(sb1 instanceof Book +" ");
System.out.print(b1 instanceof ScientificBook+" ");
System.out.println(sb1 instanceof ScientificBook);}
}

• Програма друкує
class Book class ScientificBook true true false true
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Визначення iнкапсуляцiї

• Об’єкт реального свiту визначається своїм станом та


поведiнкою.
• Стан програмного об’єкту визначається його дiлянками.
• Поведiнка програмного об’єкту описується в методах.
• Методи оперують iз дiлянками об’єкту та призначенi для
обмiном повiдомленнями помiж об’єктами, тобто
зв’язують сукупнiсть об’єктiв.
• Для реакцiї на повiдомлення iнших об’єктiв не треба знати
стан об’єкту в деталях: достатньо, щоб об’єкт видав
результат.
Визначення iнкапсуляцiї

• Об’єкт реального свiту визначається своїм станом та


поведiнкою.
• Стан програмного об’єкту визначається його дiлянками.
• Поведiнка програмного об’єкту описується в методах.
• Методи оперують iз дiлянками об’єкту та призначенi для
обмiном повiдомленнями помiж об’єктами, тобто
зв’язують сукупнiсть об’єктiв.
• Для реакцiї на повiдомлення iнших об’єктiв не треба знати
стан об’єкту в деталях: достатньо, щоб об’єкт видав
результат.
Визначення iнкапсуляцiї

Приховування внутрiшнiх даних об’єкту та одержування доступу


до потрiбних елементiв через загально доступнi методи має
назву iнкапсуляцiя даних.
Iнкапсуляцiя забезпечується рiзними рiвнями доступу.
Деякi стани об’єкта та деяку його поведiнку можна приховати.
Можна приховати об’єкт повнiстю. Можна приховати групу
об’єктiв. Для об’єднання класiв iснують пакунки.
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Пакунки. (1 з 3)

• Пакунки — це структура, в яку класи можна органiзувати.


• Пакунок може мiстити будь-яке число класiв, за звичай
органiзованих або за iєрархiєю, або за призначенням
• Стандартнi класи системи органiзовано в пакунки
Пакунки. (2 з 3)

• Приклад
import java.util.*;
class TestDate {
public static void main(String[] args) {
System.out.println(new Date()); }
}

• Програма надрукувала
Mon Nov 12 11:00:07 EET 2007
Пакунки. (3 з 3)

• Новий пакунок може бути оголошено за допомогою


ключового слова package та iменi нового пакунку як
аргумент цього ключового слова package mypackage;
• Щоб застосовувати, класи пакунку треба ввести в
програму за допомогою ключового слова import .
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Управлiння доступом

Управляти доступом до методiв та дiлянок класу iз iнших


класiв можна за допомогою трьох модифiкаторiв управлiння
public, private, protected.
Управлiння доступом

Управляти доступом до методiв та дiлянок класу iз iнших


класiв можна за допомогою трьох модифiкаторiв управлiння
public, private, protected.
Модифiкатор застосовується до (1) верхнього рiвня, тобто
разом з оголошенням класу та (2) на рiвнi окремих дiлянок та
методiв у класi.
Управлiння доступом

(1) Клас можна описати зi словом public. В цьому випадку цей


клас можна буде застосувати будь-де в iнших класах (можливо,
разом з описом пакунку).
Якщо клас не має опису, автоматично застосовується опис
package-private. В цьому випадку до опису класу можна
звернутись лише, якщо клас розташовано у тому самому
пакунку.
Управлiння доступом

У самому класi до дiлянок та методiв можна також


застосовувати тi самi слова. що i для опису класiв. Управлiння
доступом аналогiчно до управлiння доступом до класом. Маємо
ще додатково слова private, protected.
Управлiння доступом

Наприклад, можна контролювати стан proceeding будь-якого


об’єкту ScientificBook двома шляхами:
Управлiння доступом

1) або надсилаючи об’єкту вiдповiдне повiдомлення


sb1.setProceeding();
або 2) напряму змiнюючи значення дiлянкi
sb1.proceeding = true;
Управлiння доступом

Якщо перед дiлянкою стоїть слово private, змiнювати дiлянку


можна тiльки за допомогою вiдповiдного метода.
sb1.setProceeding();
Зi методами вiдбувається аналогiчно. Якщо вiн описаний як
private, то застосовувати його можна тiльки в серединi класу.
Управлiння доступом

Слово protected вказує, що до вiдповiдної дiлянки або методу


можна звертатись як у пакунку, так i будь-якому пiдкласу з
iнших пакункiв.
Управлiння доступом

Рiвень доступу пiдсумуємо так

Опис Клас Пакунок Пiдклас Усi


public Так Так Так Так
protected Так Так Так Нi
немає Так Так Нi Нi
private Так Нi Нi Нi
final та abstract

Два iнших модифiкатора прав доступу можуть бути застосованi


для методiв та класiв.
Якщо права доступу до метода класу оголошено як final, то при
утвореннi на базi цього класу iнших пiдкласiв цей метод не
можна змiнювати.
final та abstract

Два iнших модифiкатора прав доступу можуть бути застосованi


для методiв та класiв.
Якщо права доступу до метода класу оголошено як final, то при
утвореннi на базi цього класу iнших пiдкласiв цей метод не
можна змiнювати.
Якщо метод описано як abstract, то вiн немає коду. Цей метод
обов’язково треба буде писати у пiдкласi. Iнакше кажучи, це
шлях примусити визначити метод у пiдкласi.
final та abstract

Два iнших модифiкатора прав доступу можуть бути застосованi


для методiв та класiв.
Вiдповiдно якщо словом final оголошено клас, то цей клас є
останнiй у структурi iєрархiй, на його базi не можна створювати
новий пiдклас.
final та abstract

Два iнших модифiкатора прав доступу можуть бути застосованi


для методiв та класiв.
Вiдповiдно якщо словом final оголошено клас, то цей клас є
останнiй у структурi iєрархiй, на його базi не можна створювати
новий пiдклас.
Якщо як abstract оголошено клас, то такий клас є повнiстю
абстрактним, з нього не можна утворити жодного об’єкту. Але
з цього класу можна робити пiдкласи, що вже не будуть
abstract, i тобi можна встановлювати об’єкти такого пiдкласу.
Приклад. (1 з 5)

Плата I/O
• Будь-яка плата має загальнi риси: iм’я, лiчильник
помилок, стан. Вона виконує загальнi дiї: iнiцiалiзацiя,
читання. запис.
• Правильно розробляти буде так: зробити клас IOBoard, в
якому описати головнi властивостi та поведiнку будь-якої
плати I/O, а потiм у пiдкласах визначити бiльш специфiчнi
речi. Клас IOBoard слiд зробити abstract.
• Зазначимо, що для абстрактної моделi IOBoard ми не
можемо написати код виконання операцiй, проте можемо
чiтко визначити, що це за операцiї. Такi методи варто
описати як абстрактнi.
• Метод, в якому рахуються помилки, може бути кiнцевим
(final): пiдкласи не будуть змiнювати його код.
Приклад. (2 з 5)

abstract class IOBoard {


String name; int numErrors = 0; // common to all IOBoards
IOBoard(String s) {
System.out.println("IOBoard constructor"); name = s; }
final public void anotherError() { numErrors++; }
final public int getNumErrors() { return numErrors; }
abstract public void initialize();
abstract public void read();
abstract public void write();
abstract public void close();
}

Не можна створити об’єкт


IOBoard b = new IOBoard("my board"); // wrong !!!!
Приклад. (3 з 5)

class IOSerialBoard extends IOBoard {


int port;
IOSerialBoard(String s,int p) {
super(s); port = p;
System.out.println("IOSerialBoard constructor");
}
public void initialize() {
System.out.println("initialize method in IOSerialBoard"); }
public void read() {
System.out.println("read method in IOSerialBoard"); }
public void write() {
System.out.println("write method in IOSerialBoard"); }
public void close() {
System.out.println("close method in IOSerialBoard"); }
}
Приклад. (4 з 5)

class IOEthernetBoard extends IOBoard {


long networkAddress;
IOEthernetBoard(String s,long netAdd) {
super(s); networkAddress = netAdd;
System.out.println("IOEthernetBoard constructor");
}
public void initialize() {
System.out.println("initialize method in IOEthernetBoard"); }
public void read() {
System.out.println("read method in IOEthernetBoard"); }
public void write() {
System.out.println("write method in IOEthernetBoard"); }
public void close() {
System.out.println("close method in IOEthernetBoard"); }
}
Приклад. (5 з 5)

class TestBoards1 {
public static void main(String[] args) {
IOSerialBoard serial = new IOSerialBoard("my first port",
0x2f8);
serial.initialize();
serial.read();
serial.close();
}
}
Приклад. (5 з 5)

class TestBoards1 {
public static void main(String[] args) {
IOSerialBoard serial = new IOSerialBoard("my first port",
0x2f8);
serial.initialize();
serial.read();
serial.close();
}
}

The output of the execution of this application is:


IOBoard constructor
IOSerialBoard constructor
initialize method in IOSerialBoard
read method in IOSerialBoard
close method in IOSerialBoard
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Iнкапсуляцiя – iнтерфейси

Кермо машини. Семена.


Iнкапсуляцiя – iнтерфейси

Щоб визначити загальнi даннi та риси пристроїв-карток


вводу/виводу, в нашому прикладi було створено абстрактний
клас, який пiзнiше було уточнено для кожної специфiчної
картки. Але iснує iнша можливiсть для описання бажаних
властивостей картки. Для цього можна застосувати iнтерфейс.
Iнкапсуляцiя – iнтерфейси

Щоб визначити загальнi даннi та риси пристроїв-карток


вводу/виводу, в нашому прикладi було створено абстрактний
клас, який пiзнiше було уточнено для кожної специфiчної
картки. Але iснує iнша можливiсть для описання бажаних
властивостей картки. Для цього можна застосувати iнтерфейс.
Iнтерфейс визначає, що клас буде робити, але без детального
опису, як це слiд робити.
Iнкапсуляцiя – iнтерфейси

Щоб визначити загальнi даннi та риси пристроїв-карток


вводу/виводу, в нашому прикладi було створено абстрактний
клас, який пiзнiше було уточнено для кожної специфiчної
картки. Але iснує iнша можливiсть для описання бажаних
властивостей картки. Для цього можна застосувати iнтерфейс.
Iнтерфейс визначає, що клас буде робити, але без детального
опису, як це слiд робити.
Опис iнтерфейсу виглядає, як опис класу, але це не клас, а
специфiкацiя сукупностi вимог до класу, який задовольняє
вимогам iнтерфейсу.
Iнкапсуляцiя – iнтерфейси

Щоб визначити загальнi даннi та риси пристроїв-карток


вводу/виводу, в нашому прикладi було створено абстрактний
клас, який пiзнiше було уточнено для кожної специфiчної
картки. Але iснує iнша можливiсть для описання бажаних
властивостей картки. Для цього можна застосувати iнтерфейс.
Iнтерфейс визначає, що клас буде робити, але без детального
опису, як це слiд робити.
Опис iнтерфейсу виглядає, як опис класу, але це не клас, а
специфiкацiя сукупностi вимог до класу, який задовольняє
вимогам iнтерфейсу.
Iнтерфейс схожий на клас, в якому всi дiлянки є статичними
константами, усi методи мають загальний доступ (public), а в
методах немає коду (тiло метода порожньо).
Iнкапсуляцiя – iнтерфейси

Iнтерфейс визначає, що клас буде робити, але без детального


опису, як це слiд робити.
Опис iнтерфейсу виглядає, як опис класу, але це не клас, а
специфiкацiя сукупностi вимог до класу, який задовольняє
вимогам iнтерфейсу.
Iнтерфейс схожий на клас, в якому всi дiлянки є статичними
константами, усi методи мають загальний доступ (public), а в
методах немає коду (тiло метода порожньо).
Iз iнтерфейсу не можна створювати об’єктiв.
Iнкапсуляцiя – iнтерфейси

Iнтерфейс визначає, що клас буде робити, але без детального


опису, як це слiд робити.
Опис iнтерфейсу виглядає, як опис класу, але це не клас, а
специфiкацiя сукупностi вимог до класу, який задовольняє
вимогам iнтерфейсу.
Iнтерфейс схожий на клас, в якому всi дiлянки є статичними
константами, усi методи мають загальний доступ (public), а в
методах немає коду (тiло метода порожньо).
Iз iнтерфейсу не можна створювати об’єктiв.
Слово implements можна застосувати в оголошеннi класiв, якi
будуть реалiзовувати цей iнтерфейс, або, iнакше кажучи,
класи, в якому програмуються всi методи, що були оголошеннi
у вiдповiдному iнтерфейсi.
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Приклад iнтерфейсу
Для прикладу з модулями вводу-виводу можна застосувати
iнтерфейс, якщо ми не зацiкавленi тримати iм’я картки та
рахiвник помилок. В рештi решт, цi параметри можна додати
пiзнiше.
/**
* IO board interface */
interface IOBoardInterface {
public void initialize();
public void read();
public void write();
public void close();
}
Клас IOSerialBoard можна визначити як клас, що буде
реалiзовувати цей iнтерфейс, а не як пiдклас iншого класу.
/**
* IO serial board Class (second version) */
class IOSerialBoard2 implements IOBoardInterface {
// код класу
// ...
}
Приклад iнтерфейсу
Iнтерфейс IOboard можна визначити наступним чином:
/**
* IO board interface */
interface IOBoardInterface {
public void initialize();
public void read();
public void write();
public void close();
}
Клас IOSerialBoard можна визначити як клас, що буде
реалiзовувати цей iнтерфейс, а не як пiдклас iншого класу.
/**
* IO serial board Class (second version) */
class IOSerialBoard2 implements IOBoardInterface {
// код класу
// ...
}
Приклад iнтерфейсу
Iнтерфейс IOboard можна визначити наступним чином:
/**
* IO board interface */
interface IOBoardInterface {
public void initialize();
public void read();
public void write();
public void close();
}
Клас IOSerialBoard можна визначити як клас, що буде
реалiзовувати цей iнтерфейс, а не як пiдклас iншого класу.
/**
* IO serial board Class (second version) */
class IOSerialBoard2 implements IOBoardInterface {
// код класу
// ...
}
Приклад iнтерфейсу

/**
* IO board interface */
interface IOBoardInterface {
public void initialize();
public void read();
public void write();
public void close();
}
Клас IOSerialBoard можна визначити як клас, що буде
реалiзовувати цей iнтерфейс, а не як пiдклас iншого класу.
/**
* IO serial board Class (second version) */
class IOSerialBoard2 implements IOBoardInterface {
// код класу
// ...
}
Приклад iнтерфейсу
Iнтерфейс IOboard можна визначити наступним чином:
/**
* IO board interface */
interface IOBoardInterface {
public void initialize();
public void read();
public void write();
public void close();
}
Клас IOSerialBoard можна визначити як клас, що буде
реалiзовувати цей iнтерфейс, а не як пiдклас iншого класу.
/**
* IO serial board Class (second version) */
class IOSerialBoard2 implements IOBoardInterface {
// код класу
// ...
}
Приклад реалiзацiї iнтерфейсу
/**
* IO serial board Class (second version)
*/
class IOSerialBoard2 implements IOBoardInterface {
int port;
IOSerialBoard2(int p) {
port = p;
System.out.println("IOSerialBoard constructor"); }
public void initialize() {
System.out.println("initialize method in IOSerialBoard");
}
public void read() {
System.out.println("read method in IOSerialBoard");
}
public void write() {
System.out.println("write method in IOSerialBoard");
}
public void close() {
System.out.println("close method in IOSerialBoard");
}
}
Приклад застосування класу

/**
* Test Boards3 class Application
*/
class TestBoards3 {
public static void main(String[] args) {
IOSerialBoard2 serial= new IOSerialBoard2(0x2f8);
serial.initialize();
serial.read();
serial.close();
}
}
Декiлька iнтерфейсiв

Клас може реалiзувати бiльше, нiж один iнтерфейс. Наприклад,


нехай ми маємо також iнтерфейс з назвою niceBehaviour, в
якому визначенi наступнi методи, що будуть пiзнiше реалiзованi
в „чудових” класах.
/**
* Nice behavior interface
*/
interface NiceBehavior {
public String getName();
public String getGreeting();
public void sayGoodBye();
}
Декiлька iнтерфейсiв, продовження

Якщо потрiбно, щоб клас, що реалiзує serial board, виконував


одночасно методи iнтерфейсу IOBoardInterface та NiceBehavior,
то цей клас слiд визначити у такий спосiб:
/**
* IO serial board Class (third version)
*/
class IOSerialBoard3 implements IOBoardInterface,
NiceBehavior {
...
}

Компiлятор Java згенерує бiт-код класу тiльки якщо


реалiзованi всi методи, визначенi в обох iнтерфейсах.
Таким чином, схожий результат можна отримати як за
допомогою iнтерфейсiв, так i за допомогою абстрактних
класiв.
Одиноке та багатократне наслiдування

Деякi об’єктно-орiєнтованi мови програмування, наприклад


C++, можуть реалiзувати наслiдування вiд бiльше, нiж одного
класу. (multiplay inheritance)
Java не дозволяє такого. (single inheritance). Java дозволяє
класу реалiзовувати бiльше, нiж один iнтерфейс, але не
допускає, щоб пiдклас мав декiлька основних класiв.
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Що таке полiморфiзм

• Грецьке слово полiморфiзм тлумачиться як одне слово,


багато значень
• Автоматичне перемикання передач автомобiля
• полiморфiзм рiвня компiлятора.
• полiморфiзм виконання
Полiморфiзм рiвня компiлятора

Найбiльш вiдомий приклад полiморфiзму є можливiсть


замiнити чотири функцiї Сi:
• abs() integer
• labs() long integer
• fabs() float
• fabsl() long double
однiєю функцiєю ABS() у Java.
Змiст
1 Спадкування
Inheritance: як це в життi та в програмi
Спадкування: клас, конструктор, метод
2 Iнкапсуляцiя
Визначення iнкапсуляцiї
Пакунки
Управлiння доступом
Iнтерфейси
Приклад
3 Полiморфiзм
Загальне визначення
Приклад
4 Винятковi ситуацiї
5 CORBA та RMI
6 Введення до розробки ООП
7 Фiнальнi нотатки
Приклад. (1 з 3)

Полiморфнi можливостi дозволяють виконувати один


конкретний метод, що вибирається з багатьох методiв з
однаковою назвою. Можна сказати i так, що рiзнi об’єкти
можуть вiдповiдати на однотипнi повiдомлення, тобто вони
мають один iнтерфейс.
В наступному прикладi два рiзних об’єкта, що вiдповiдають
рiзним класам, мають полiморфiчнi можливостi, що дозволяє
працювати з ними однаково.
Приклад (2 з 3)

class TestBoards2 {
public static void main(String[] args) {
IOBoard[] board = new IOBoard[3];
board[0] = new IOSerialBoard("my first port",0x2f8);
board[1] = new IOEthernetBoard("my second port",0x3ef8dda8);
board[2] = new IOEthernetBoard("my third port",0x3ef8dda9);
for(int i = 0;i < 3;i++) board[i].initialize();
for(int i = 0;i < 3;i++) board[i].read();
for(int i = 0;i < 3;i++) board[i].close();
}
}
Приклад (3 з 3)
• В програмi маємо масив трьох об’єктiв IOBoard. Здається,
що таке неможливо, бо такий об’єкт оголошено як
абстрактний.
• Проте цей абстрактний клас має два пiдклас, що не є
абстрактними. Тому оператори призначення, що показанi в
прикладi, можливi.
• Щоб працювати iз картками, нам треба спочатку їх
iнiцiалiзувати, потiм щось читати iз них, а потiм закрити.
Таким чином iнтерфейс до карток однаковий, i це дає нам
можливiсть зберiгати екземпляри рiзних карток в одному
масивi та працювати з картками, надсилаючи вiдповiднi
повiдомлення без додаткового уточнення специфiчного
типу картки.

• Це можливо тому, що вiдповiднi методи мають


полiморфiчнi властивостi
Exceptions, або винятковi ситуацiї. (1 з 10)
Стандартна дiя Java реакцiя на виняткову ситуацiю —
припинення подальшої обробки коду й видача вiдповiдного
повiдомлення. Також встановлюється код повертання,
вiдмiнний вiд нуля.
/** Test Exceptions class Application */
class TestExceptions1 {
public static void main(String[] args) {
String s = "Hello";
System.out.print(s.charAt(10));
}
}

Програма надрукує наступне:


Exception in thread "main"
java.lang.StringIndexOutOfBoundsException:
String index out of range: 10
at java.lang.String.charAt(String.java:499)
at TestExceptions1.main(TestExceptions1.java:11)
Exceptions, або винятковi ситуацiї. (2 з 10)

Помилка такого штибу, або в термiнологiї Java, еxeption –


виняткова ситуацiя – може бути „перехоплена” та оброблена
програмiстом за допомогою операторiв try та catch :
/** Test Exceptions class Application (v2) */
class TestExceptions2 {
public static void main(String[] args) {
String s = "Hello";
try { System.out.println(s.charAt(10)); }
catch (Exception e) {
System.out.println("No such position"); }
}
}

Пiд час виконання така програма виводить наступне:


No such position
Exceptions, або винятковi ситуацiї. (3 з 10)

Якщо помилка виникає у блоцi try, управлiння передається до


блоку catch, що контролює всi можливi винятковi ситуацiї.
Специфiчну помилку можна обробити наступним чином:
/** Test Exceptions class Application (v3) */
class TestExceptions3 {
public static void main(String[] args) {
String s = "Hello";
try { System.out.println(s.charAt(10)); }
catch (StringIndexOutOfBoundsException e) {
System.out.println("No such position"); }
}
}
Exceptions, або винятковi ситуацiї. (4 з 10)
Об’єкту з класу exeption можна надiслати повiдомлення. У
наступному прикладi об’єкту e надсилається повiдомлення
toString:
/** Test Exceptions class Application (v4) */
class TestExceptions4 {
public static void main(String[] args) {
String s = "Hello";
try { System.out.println(s.charAt(10));}
catch (StringIndexOutOfBoundsException e) {
System.out.println("No such position");
System.out.println(e.toString()); }
}
}

Така програма виводить наступне:


No such position
java.lang.StringIndexOutOfBoundsException:
String index out of range: 10
Exceptions, або винятковi ситуацiї. (5 з 10)

Оператор try дозволяє перехоплювати бiльше, нiж один вид або


групу виняткових ситуацiй, тобто можна мати декiлька блокiв
catch на один блок try.
Exceptions, або винятковi ситуацiї. (5 з 10)

Оператор try дозволяє перехоплювати бiльше, нiж один вид або


групу виняткових ситуацiй, тобто можна мати декiлька блокiв
catch на один блок try.
Можна виконати деякий блок операторiв незалежно вiд умов
виконання операторiв у блоцi try. Для цього пiсля блоку catch
слiд застосувати ключове слово finally з вiдповiдним
блоком операторiв. Як правило, вiн застосовується для
звiльнення деяких ресурсiв та пам’ятi.
Exceptions, або винятковi ситуацiї. (5 з 10)

Оператор try дозволяє перехоплювати бiльше, нiж один вид або


групу виняткових ситуацiй, тобто можна мати декiлька блокiв
catch на один блок try.
Можна виконати деякий блок операторiв незалежно вiд умов
виконання операторiв у блоцi try. Для цього пiсля блоку catch
слiд застосувати ключове слово finally з вiдповiдним
блоком операторiв. Як правило, вiн застосовується для
звiльнення деяких ресурсiв та пам’ятi.
Можна також генерувати власнi винятковi ситуацiї за
допомогою оператора throw. Його параметром є об’єкт, який
належить до класу виняткових ситуацiй. Таке часто
застосовується у якостi „затичку” для коду.
Exceptions, або винятковi ситуацiї. (5 з 10)

Можна виконати деякий блок операторiв незалежно вiд умов


виконання операторiв у блоцi try. Для цього пiсля блоку catch
слiд застосувати ключове слово finally з вiдповiдним
блоком операторiв. Як правило, вiн застосовується для
звiльнення деяких ресурсiв та пам’ятi.
Можна також генерувати власнi винятковi ситуацiї за
допомогою оператора throw. Його параметром є об’єкт, який
належить до класу виняткових ситуацiй. Таке часто
застосовується у якостi „затичку” для коду.
Наступний приклад демонструє застосування двох блокiв
catchта блоку finally. Тут визначено метод, якому в параметрi
передається рядок, що за правилам граматики мусить
закiнчитись крапкою. У поданому рядку заходиться перший та
останнiй символи. Двi виняткових ситуацiї контролюються, а
потiм генерується власна.
Exceptions, або винятковi ситуацiї. (6 з 10)

Class MultipleCatch {
public void printInfo(String sentence) {
try {
// get first and last char before the dot
char first = sentence.charAt(0);
char last = sentence.charAt(sentence.indexOf(".") - 1);
String out = String.format("First: %c Last: %c",
first, last);
System.out.println(out);
} catch (StringIndexOutOfBoundsException e1) {
System.out.println("Wrong sentence, no dot?");
} catch (NullPointerException e2) {
System.out.println("Non valid string");
} finally {
System.out.println("done!");
}
}
throw new UnsupportedOperationException("Nothing more");
}
Exceptions, або винятковi ситуацiї. (7 з 10)

• Метод оперує зi двома винятковими ситуацiями.


1 Перша генерується, якщо неможливо визначити символ
перед крапкою через те, що сама крапка вiдсутня або у
вираз нiчого, крiм крапки, нiчого немає.
2 Друга генерується, якщо рядок порожнiй, тобто значення є
null.
• Слiд зазначити, що метод indexOf повертає iндекс першого
символу рядку, що передано в аргументах. Якщо рядок не
знайдено, метод повертає 0.
Exceptions, або винятковi ситуацiї. (8 з 10)

• Якщо виконаємо таких три оператора:


1 String sentence = "A test sentence.";
2 MultipleCatch mc = new MultipleCatch();
3 mc.printInfo(sentence);

• Програма надрукує:
First: A Last: e
done!
Exception in thread "main"java.lang.UnsupportedOperationException: Nothing more
at exeption.MultipleCatch.printInfo(MultipleCatch.java:32)
at exeption.Main.main(Main.java:24)

Java Result: 1

• Жодна виняткова ситуацiя не з’являється.


• Блок finally виконується.
• Пiсля обробки генерується запланована виняткова ситуацiя.
Exception, або винятковi ситуацiї. (9 з 10)

• Якщо виконаємо таких три оператора:


1 String sentence = "A test sentence";
2 MultipleCatch mc = new MultipleCatch();
3 mc.printInfo(sentence);

• Програма надрукує:
Wrong sentence, no dot?
done!
Exception in thread "main"java.lang.UnsupportedOperationException: Nothing more
at exeption.MultipleCatch.printInfo(MultipleCatch.java:32)
at exeption.Main.main(Main.java:24)

Java Result: 1

• Обробляється виняткова ситуацiя


StringIndexOutOfBoundsException.
• Блок finally виконується.
• Пiсля обробки генерується запланована виняткова ситуацiя.
Exception, або винятковi ситуацiї. (10 з 10)

• Якщо виконаємо таких три оператори:


1 String sentence = null;
2 MultipleCatch mc = new MultipleCatch();
3 mc.printInfo(sentence);

• Програма надрукує:
Non valid string
done!
Exception in thread "main"java.lang.UnsupportedOperationException: Nothing more
at exeption.MultipleCatch.printInfo(MultipleCatch.java:32)
at exeption.Main.main(Main.java:24)

Java Result: 1

• Обробляється виняткова ситуацiя NullPointerException.


• Блок finally виконується.
• Пiсля обробки генерується запланована виняткова ситуацiя.
Розподiленi об’єкти. CORBA

Як можна побудувати будiвлю iз матерiалiв, що придбанi у


рiзних постачальникiв, так можна побудувати програму, що
працює за допомогою мережi та застосовує частини програм,
що написанi рiзними мовами та призначеними для виконання
на рiзних платформах.Таки частини програм звуться
розподiленими об’єктами.
Розподiленi об’єкти. CORBA

Як можна побудувати будiвлю iз матерiалiв, що придбанi у


рiзних постачальникiв, так можна побудувати програму, що
працює за допомогою мережi та застосовує частини програм,
що написанi рiзними мовами та призначеними для виконання
на рiзних платформах.Таки частини програм звуться
розподiленими об’єктами.
CORBA розроблена щоб забезпечити таки можливостi.
Розподiленi об’єкти. CORBA

CORBA — Common Object Request Broker Architecture 1 .


CORBA є вiдкритою, незалежною вiд виробника програмного
забезпечення специфiкацiєю архiтектури та iнфраструктури
комп’ютерних програм для сумiсної роботи через мережу.
Такий пiдхiд дозволяє програмам для рiзних операцiйних
систем, написаних рiзними мовами та вiд рiзних виробникiв,
але вiдповiдних до CORBA, взаємодiяти з iншими
CORBA–програмами.

1
Архiтектура посередника запитiв типового об’єкта
Розподiленi об’єкти. CORBA

CORBA є корисною для багатьох ситуацiй.


• Загальне рiшення для великого (та й не дуже великого)
бiзнесу через можливiсть iнтеграцiї рiзних машин з
рiзними обчислювальними потужностями
• Пропонує загальну структуру для потужних WEB–серверiв,
через можливiсть роботи з багатьма запитами одночасно.
• спецiалiзованi версiї CORBA для систем реального часу.
Розподiленi об’єкти. CORBA

Як можна побудувати будiвлю iз матерiалiв, що придбанi у


рiзних постачальникiв, так можна побудувати програму, що
працює за допомогою мережi та застосовує частини програм,
що написанi рiзними мовами та призначеними для виконання
на рiзних платформах.Таки частини програм звуться
розподiленими об’єктами.
CORBA програмами будуються з об’єктiв, якi є
апаратно-програмними пристроями для обслуговування та
обробки даних та часто (хоч i не завжди) представляють
якийсь об’єкт, що реально iснує
RMI

• CORBA пропонує загальний шлях вирiшення проблеми.


Java пiдтримує специфiкацiї CORBA, але й має iнший
шлях для вирiшення проблеми — RMI.
• RMI надає об’єктам можливiсть взаємодiяти та
обмiнюватись даними за допомогою мережi. Це полегшує
побудову великої розподiленої системи на базi архiтектури
сервер-клiєнт. RMI є акронiм Remote Method
Invocation.1
• Взаємодiя за допомогою RMI та CORBA переважно не
дуже швидка i тому непридатна для багатьох задач, але
добре пасує для вiддаленого спостереження, коли час
вiдповiдi не є критичний.

1
виклик вiдлеглих методiв
RMI

• CORBA пропонує загальний шлях вирiшення проблеми.


Java пiдтримує специфiкацiї CORBA, але й має iнший
шлях для вирiшення проблеми — RMI.
• RMI надає об’єктам можливiсть взаємодiяти та
обмiнюватись даними за допомогою мережi. Це полегшує
побудову великої розподiленої системи на базi архiтектури
сервер-клiєнт. RMI є акронiм Remote Method
Invocation.1
• Взаємодiя за допомогою RMI та CORBA переважно не
дуже швидка i тому непридатна для багатьох задач, але
добре пасує для вiддаленого спостереження, коли час
вiдповiдi не є критичний.

1
виклик вiдлеглих методiв
RMI

• CORBA пропонує загальний шлях вирiшення проблеми.


Java пiдтримує специфiкацiї CORBA, але й має iнший
шлях для вирiшення проблеми — RMI.
• RMI надає об’єктам можливiсть взаємодiяти та
обмiнюватись даними за допомогою мережi. Це полегшує
побудову великої розподiленої системи на базi архiтектури
сервер-клiєнт. RMI є акронiм Remote Method
Invocation.1
• Взаємодiя за допомогою RMI та CORBA переважно не
дуже швидка i тому непридатна для багатьох задач, але
добре пасує для вiддаленого спостереження, коли час
вiдповiдi не є критичний.
Iдея RMI та CORBA є фiзична незалежнiсть реалiзацiї об’єктiв та
iнтерфейсiв при збереженнi логiчної тотожностi.

1
виклик вiдлеглих методiв
CORBA Versus RMI
Хоч RMI та CORBA застосовуються для досягнення схожих кiнцевих
результатiв, вони не є сумiсними!

• Для RMI програма користувача та вiддаленi об’єкти


мусять бути реалiзованi в Java, що надає легкий механiзм
комунiкацiї об’єктiв через мережу та набiр iнструментiв для
забезпечення сумiсної роботи. Усi необхiднi речi —
iнструменти, класи тощо є у складi вiртуальнiй машинi
Java.
• CORBA є специфiкацiєю та архiтектурою iнтеграцiї
мережевих об’єктiв. Виробники програмного забезпечення
слiдують специфiкацiям CORBA, щоб надати такi
можливостi. Реалiзацiя для Java зроблена фiрмою Sun
Microsystems
Введення до розробки об’єктно-ориентованих програм

• Об’єктно-орiєнтоване розробка програм — це особлива


технологiя i яка не є частиною об’єктно-орiєнтованого
програмування.
• Об’єктно-орiєнтовне програмування як частина
об’єктно-орiєнтованої розробки програм
• Головне. особливо на першому етапi — визначити, що буде
класами, якi вiн буде мати дiлянки та методи.
• Однiєю iз технологiй є написання оповiдання про
вирiшення задачi, а потiм головнi застосованi iменники
визначити як класи та дiлянки класiв; а дiєслова — як
методи.
Приклад оповiдання

• Розробити двобiтовий лiчильник iз такими можливостями:


1 Iнiцiалiзацiя лiчильника обнуляє його бiти: 00;
2 Додавання до лiчильника одиницi;
3 Показ означає показати змiст лiчильника.
• Кожен бiт мусить мати таки можливостi:
1 set значення в 0;
2 get значення у виглядi бiта;
3 add 1 до значення, що зберiгається та повернути
перенесення:
0 + 0 = 0, c = 0
0 + 1 = 1, c = 0
1 + 0 = 1, c = 0
1 + 1 = 0, c = 1
• Програма для перевiрки мусить створити екземпляр
лiчильника Counter та перевiрити його шляхом додавання
1 три рази; результат показувати:
00 01 10 11
Програма — клас Bit

class Bit{
int value;
void set() { value = 0; }
int get() {return value;}
// method to implement binary addition
// we provide the table here:
int add(int inValue){ int carry = 0;
if((value==0)&&(inValue == 0)) {//0+0=0,c=0
carry = 0; }
else if((value == 0)&&(inValue==1)){//0+1=1,c=0
value = 1; carry = 0; }
else if((value==1)&&(inValue==0)) {//1+0=1,c=0
carry = 0; }
else if((value==1)&&(inValue==1)) {//1+1=0,c=1
value = 0; carry = 1; }
return carry; }
}
Програма — клас Counter

class Counter{
Bit fstbit = new Bit();
Bit scndbit= new Bit();
void initialize(){
fstbit.set();
scndbit.set(); }
void increment(){
scndbit.add(fstbit.add(1));
}
void show() {
System.out.println("" +
scndbit.get() + fstbit.get() );
}
}
Програма — TestCounter

class TestCounter {
public static void main(String[] args){
//instantiate a counter object
Counter myCounter = new Counter();

myCounter.initialize();
myCounter.show();

//increment and display counter object


for(int cnt = 0; cnt < 3; cnt++){
myCounter.increment();//increment it
myCounter.show();//display it
} //end for loop
} //end main()
} //end for TestCounter
Фiнальнi нотатки

ООП потребує iншого стилю розробки програм. Загальну


поведiнку та властивостi треба визначити та описати в
iєрархiчних класах. Бiльшiсть роботи ввижається зробленою
пiсля того, як iєрархiя класiв буде визначена. Залишається
тiльки встановити екземпляри об’єктiв iз цих класiв та
надiслати повiдомлення об’єктам.
Фiнальнi нотатки

При розробцi коду класу слiд приховувати ту частину


iнформацiї про клас, яка стосується реалiзацiї. Головний
принцип був сформульований Парнасом:

розробник програмної компоненти зобов’язаний видати всю


iнформацiю, потрiбну для використання класу, i не слiд
додавати до цього нiчого зайвого.

Це призводить до того, що код класу стає бiльш скритним,


захищає його та спрощує iнтерфейс.
Переваги та недолiки OOП

• Переваги ООП:
• Код часто використовується, є спiльним через спадкування
та iнкапсуляцiю;
• легко управляється: замiни в суперкласi передаються в
пiдкласи;
• незалежнiсть коду через iнкапсуляцiю. Передається тiльки
iнтерфейс;
• висока модульнiсть та органiзацiя коду. Важливо для
великих програм;
• треба бiльше думати перед кодуванням.
• Недолiки ООП:
• Готовi програми, як правило, бiльше, бо механiзм
спадкування мусить бути реалiзовано пiд час виконання;
• виконуються програми часто повiльнiше, бо механiзм
спадкування примушує продивлятись пiдкласи.

You might also like