Professional Documents
Culture Documents
OOP Java II
OOP Java II
Олекс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 нотатки
Спадщина
• Програма надрукує:
S.H.
Спадкування: метод. (3 з 4)
• Розглянемо програму
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ї
• Приклад
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)
Плата 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)
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();
}
}
/**
* 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в
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чного
типу картки.
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)
• Програма надрукує:
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
• Програма надрукує:
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
• Програма надрукує:
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
1
Архiтектура посередника запитiв типового об’єкта
Розподiленi об’єкти. CORBA
1
виклик вiдлеглих методiв
RMI
1
виклик вiдлеглих методiв
RMI
1
виклик вiдлеглих методiв
CORBA Versus RMI
Хоч RMI та CORBA застосовуються для досягнення схожих кiнцевих
результатiв, вони не є сумiсними!
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();
• Переваги ООП:
• Код часто використовується, є сп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дкласи.