![]() | Мова програмування Java та технології J2EEЛекція 3. Модифікатор static. ООП у мові програмування Java (Успадкування. Інкапсуляція. Поліморфізм) Абстрактні класи. Інтерфейси. Вкладені класи. Локальні та анонімні класи. Enum. Діаграми класів UML Модифікатор static 1/3Приклад public class SmallSquares { private static final int LIMIT = 10; private static final int[] square = new int [LIMIT]; static { for (int i = 0; i < LIMIT; i++) { square[i] = i * i; } } public static int getSquare(int i) { return square[i]; // доступ до статичного поля із статичного // методу - ok } } Статичне поле Статичне поле та його ініціалізація Блок статичної ініціалізації Статичний метод Модифікатор static 2/3Коли виконується ініціалізація статичних полів Коли виконується блок статичної ініціалізації Під час ініціалізації класу в JVM Модифікатор static (3/3)Модифікатор static застосовується до:
Методів Блоків статичної ініціалізації класу Вкладених класів (далі у цій лекції) Статичні поля Поля, які є загальними для всіх екземплярів класу. Існування значення статичного поля не залежить від того, чи існують екземпляри класу Аналог глобальних змінних Статичні методи Методи, які є загальними для всіх екземплярів класу. Виклик методу не залежить від того, чи існують екземпляри класу Звернення до статичних полів та статичних методів – по повному імені (із зазначенням класу) При використанні import static – по короткому імені (тільки назва поля/методу) this, super Ці ключові слова не можуть бути застосовані всередині статичних методів та блоків статичної ініціалізації static, this, superpublic class User{ private String name; public static generatePassword () { return name + “password”; } } Лекція 3UML. ООП у мові Java Принципи парадигми ООПАбстракція - приховати деталі та бачити головне Механізми, що реалізують поняття “абстракція” у ООП
Інкапсуляція Поєднання даних та методів в одному об’єкті Приховування деталей реалізації Поліморфізм Перекриття методів у класах-нащадках Найчастіші помилки при використанні ООП УСПАДКУВАННЯУспадкуванняЩо можна зробити за допомогою успадкування:
Додати нові поля та методи Додати нові статичні поля та методи Мати доступ до полів та методів базового класу згідно модифікаторам доступу Перекрити методи Види успадкування (мається на увазі успадкуванні реалізацій): Одиночне – успадкування тільки одного базового класу (Java, C#) Множинне – успадкування декількох базових класів (C++) Альтернативна термінологія Клас-пращур = базовий клас = супер-клас Клас-нащадок = похідний клас = під-клас Зв’язок з теорією множин Відношення ієрархії класів ABC Відношення включення множин ABC Успадкування в JavaМова Java підтримує
множинне успадкування інтерфейсів - implements class A {…} class B extends A {…} interface I1 {…} interface I1 {…} class C implements I1, I2 {…} class D extends A implements I1, I2 {…} Приведення типів class Bike {} class MountainBike extends Bike {} Bike b1 = new MountainBike(); MountainBike b2 = (MountainBike) b1; Модифікатор final для класуКлас не може мати класів-нащадків public final class User { … } public class Admin extends User { … } instanceof
class B extends A {…} interface I1 {…} interface I1 {…} class C implements I1, I2 {…} class D extends A implements I1, I2 {…} instanceof – перевірка типу (new B() instanceof A) // true (new C() instanceof I1) // true this. superthis – доступ до поточного класу (до полів, методів) super – доступ до
До перекритих методів базового класу До прихованих полів та методів базового класу this/super не можуть застосовуватись у static-методах Виклик конструктораЯвний виклик конструктора базового класу
public Bike(int startCadence, int startSpeed, int startGear) {…} } class MountainBike extends Bike { … public MountainBike(int height, int cadence, int speed, int gear) { super(cadence, speed, gear); seatHeight = height; } } Неявний виклик конструктора базового класу class A () { public A(){} public A(int i){...} public A (char c) {...} } class B extends A { public B(int i) { } // неявний виклик super() public B(char c) { super(); } // явний виклик super() } Як емулювати множинне успадкуванняЩо робити якщо не вистачає множинного успадкування реалізацій?
ІНКАПСУЛЯЦІЯІнкапсуляція в JavaЗадача інкапсуляції - приховати, як влаштований об’єкт
Зміна об’єкта здійснюється тільки за допомогою публічних методів Приклад інкапсуляції: стек із операціями додавання/виштовхування із стеку та методом для отримання верхнього елементу стеку
... public void push(int x) {...} public int pop() {...} public int getTop() {...} } застосування модифікаторів доступу до полів та методів інкапсуляції полів шляхом реалізації методів get/set Модифікатори доступуМодифікатори можуть обмежити доступ до:
Вкладених класів Конструкторів Полів Методів Області видимості
Зверніть увагу на порядок модифікаторів – зручний для сприйняття Інкапсуляція полів. Методи get/setІнкапсуляція полів
“getter” - public-метод для отримання значення поля “setter” - public-метод для перевірки вхідних значень та встановлення значення поля Приклад: public class Rectangle { private int left, top, width, legth; public int getLeft() { return left; } public void setLeft(int left) { this.left = left; } public int getTop() { return top; } public void setTop(int top) { this.top = top; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getLegth() { return legth; } public void setLegth(int legth) { this.legth = legth; } } Угода щодо назв методів: Якщо поле називається name,то getter має назву getName setter має назву setName Якщо поле типу boolean, то назва getter - isName Варіанти: може бути відсутній getter може бути відсутній setter може бути відсутнє поле ПОЛІМОРФІЗМПриклад поліморфізмуПоліморфізм в JavaПоліморфізм
Синтаксично досягається перекриттям методу базового класу в класі-нащадку Поліморфізм в Java = перекриття методів Перекриття = перевизначення = override В С++ можуть бути перекриті тільки віртуальні методи В Java всі методи “віртуальні” – можуть бути перекриті майже всі;-) Поліморфізм = динамічне зв’язування Статичне зв’язування / Динамічне зв’язування static-методи – статичне (раннє) зв’язування, на етапі компіляції Інші методи – динамічне (пізнє) зв’язування, на етапі виконання Які модифікатори забороняють перекриття методуМодифікатор, який забороняє перекриття методу
Інші модифікатори, які не дозволяють перекриття методів static private Сигнатури методівМетоди f та g мають однакову сигнатуру, якщо вони мають
Однакову кількість аргументів Однакові типи аргументів Увага. Поняття сигнатури не містить типу значень, що повертаються! Для generic: cигнатура методу f є підсигнатурою методу g, якщо Сигнатури методів f та g однакові Або, якщо f параметризовано: після видалення параметрів у сигнатурі методу f, сигнатури f та g є однаковими Сигнатура методу f є еквівалентною сигнатурі методу g, якщо Сигнатура методу f є підсигнатурою g та сигнатура методу g є підсигнатурою f Увага у мові Java на відміну від C++ при порівнянні сигнатур не враховуються похідні типи. Тому помилково замість перекриття методів програміст виконує перевантаження. Якщо у одному класі визначено два методи з однаковою/еквівалентною сигнатурою, то помилка компіляції
class Point implements Move { int x, y; abstract void move(int dx, int dy); void move(int dx, int dy) { x += dx; y += dy; } } Приклад 2: class A { public int foo() {return 1;} public long foo() {return 1L;} } Перекриття та приховування методівРозглянемо методи базового та похідного класу з однаковою сигнатурою Методи екземплярів
Методи класів (static) приховуються Правила перекриття методівДано клас C та метод c, клас A та метод a Метод c перекриває a, якщо
сигнатура методу c є підсигнатурою методу a Метод a у батьківському класі має модифікатор доступу public, protected, не_вказано видимість методу у класі-нащадку не звужується (див. таблицю нижче) виконуються вимоги щодо типів значень, що повертається у методі похідного класу (*) Виконуються вимоги щодо виключних ситуацій, що генеруються в методі. Кількість виключних ситуацій в секції throws не може збільшуватись. Типи виключних ситуацій можуть уточнюватись (*) * визначено далі
Вимоги до перекриття та приховування методівПриховування полів та методівПриховування полів
static-поле може приховувати звичайне поле Має сенс тільки для static-методів static-метод не може приховувати звичайний метод (помилка компіляції) Модифікатор final забороняє приxовування методів Приховування методівpublic class ClassA { public void methodOne(int i) { } public static void methodTwo(int i) { } } public class ClassB extends ClassA { public void methodOne(int i) { } public static void methodTwo(int i) { } } Перекриття vs перевантаженняНе плутати перекриття з перевантаженням
Перевантаження – створення методу у тому самому класі або у класі-нащадку із іншим набором параметрів Розповсюджена помилка при перекритті методу Object.equals public boolean equals(Object that) { ... } // перекриття public boolean equals(Foo that) { ... } // перевантаження Анотація @Override – ваш помічник при використання перекриття @Override викликає помилку компіляції, якщо не виконуються правила перекриття Перевантаження методів (overload)Перевантаження:
На прикладі java.io.PrintStream
public void print(char c) public void print(char[] s) public void print(float f) public void print(double d) public void print(int i) public void print(long l) public void print(Object obj) public void print(String s) АБСТРАКТНІ КЛАСИАбстрактні класи та методиАбстрактний клас
Не може бути інстанційований Може бути успадкований Містить абстрактні методи (не обов’язково) Має модифікатор abstract
Не має реалізації Має модифікатор abstract
public abstract int getVertexCount(); } public class PolyLine extends Line { private int n; public int getVertexCount () {return n;) } public class MonoLine extends Line { public int getVertexCount () {return 2;) } Модифікатор abstractМодифікатор abstract може бути застосований до abstract-методів. Приклад:
char get() throws BufferEmpty, BufferError; } public abstract class InfiniteBuffer implements Buffer { public abstract char get() throws BufferError; } abstract-метод може перекрити не abstract-метод. Але робіть таке обережно! abstract class Point { int x, y; public abstract String toString();//перекриває //не абстрактний Object.toString } class ColoredPoint extends Point { int color; public String toString() { return super.toString() + ": color " + color; // Помилка } } Модифікатор abstract не застосовується до методів із модифікаторами
static final ІНТЕРФЕЙСИІнтерфейсиІнтерфейси в Java – це типи-посилання, які можуть містити:
Декларацію методів Внутрішні типи (інтерфейси чи класи) Інтерфейси не можуть бути інстанційовані public interface OperateCar { int turn(Direction direction, double startSpeed, double endSpeed); int changeLanes(Direction direction, double startSpeed, double endSpeed); int signalTurn(Direction direction, boolean signalOn); } Можуть бути успадковані похідним інтерфейсом interface OperateSolarCar extends OperateCar Можуть бути реалізовані класом class OperateElectroCar implements OperateCar Неявні модифікатори до констант та методів public static final - усі константи, визначенні у інтерфейсі, неявно мають ці модифікатори public - усі методи, задекларовані у інтерфейсі, неявно мають цей модифікатор Інтерфейси можуть бути “пустими” – інтерфейси-”маркери” Cloneable, Serializable ВКЛАДЕНІ КЛАСИПрикладиНазвіть задачі, для розв’язання яких зручно застосовувати вкладені класи Вкладені класиКласи (інтерфейси) в Java
Навіщо потрібні вкладені класи Логічне групування Застосування принципів “абстракції” та “інкапсуляції” Вкладені класи бувають 2 типів: static - “статичні вкладені класи”
не-static – “внутрішні” пов’язані з екземпляром зовнішнього класу ... static class StaticNestedClass{...} class InnerClass { ... } } Статичні вкладені класиСтатичний вкладений клас:
Доступ до статичних вкладених класів: class OuterClass { ... class StaticNestedClass {…} } OuterClass.StaticNestedClass Створення об’єкту такого класу OuterClass.StaticNestedClass o; o = new OuterClass.StaticNestedClass(); Внутрішні класиВнутрішній клас
екземпляр внутрішнього класу існує тільки “в рамках” екземпляру зовнішнього класу має прямий доступ до членів зовнішнього класу (див. приклад) OuterClass outerObject = new OuterClass(); OuterClass.InnerClass innerObject; innerObject = outerObject.new InnerClass(); Доступ до зовнішнього класу (на прикладі): public class OuterClass { int a=5; public class InnerClass{ int b; void print(){ System.out.println("OuterClass.this.a="+OuterClass.this.a); System.out.println("InnerClass.this.b="+InnerClass.this.b); System.out.println("a="+a); System.out.println("b="+b); // без допоміжних ключових слів } } } Вкладені класи. Модифікатори доступуМодифікатори доступу до вкладених класів:
Питання до аудиторії – чому? Вкладені інтерфейси завжди неявно мають модифікатор static Питання до аудиторії – чому? Локальні та анонімні класиЛокальний та анонімний класи – це внутрішні класи Локальний клас
void fuzzySum (int n, int m) { class FuzzyArithmetic implements Arithmetic { public void sum (int i, int j) {return i+j+1;} } return new FuzzyArithmetic.sum(n, m); } Анонімний клас Всередині методі Без назви Зручні при розробці графічного інтерфейсу користувача (AWT, Swing) для обробки подій void createListener2 (JLabel label) { label.addMouseMotionListener (new MouseMotionListener() { public void mouseDragged(MouseEvent e){…} public void mouseMoved(MouseEvent e) {…} }); } Типи-перелічення enum (1/4)enum – це спеціальний вид класів
Не може успадковуватись Не може успадковувати (класи) Може реалізувати інтерфейси (implements) enum може бути застосований в switch Склад enum Перелічувані константи - єдині екземпляри цього класу Інші звичайні складові класу: конструктори, поля, методи, вкладені класи enum Season { WINTER, SPRING, SUMMER, FALL } Типи-перелічення enum (2/4)Конструктори
public enum Coin { PENNY(1), NICKEL(5), DIME(10), QUARTER(25); Coin(int value) { this.value = value; } private final int value; public int value() { return value; } } Перелічувана константа може мати власне тіло класу (анонімний клас) public enum Season { WINTER("холодно"), SPRING("вже тепло"), SUMMER ("гаряче"), FALL("дощі") { public String getWeather() { return super.getWeather()+" та падає листя";} }; Season(String w) { weather=w; } private String weather; public String getWeather() { return weather;} } Типи-перелічення enum (3/4)
“Вбудовані” методи для роботи з enum-типами E[] values()
for(Season s : Season.values()) System.out.println(s); E valueOf(String name) повертає по назві перелічуваної константи її екземпляр Season s = Season.valueOf("WINTER"); String name() - назва константи (як визначена в enum) int ordinal() - порядковий номер, нумерація з 0 boolean equals(Object other) - порівняння int compareTo(E o) – порівняння Типи-перелічення enum (4/4)Для перелічуваних констант діє наступне правило порівняння: enum Example { ONE, TWO, THREE } ONE = = ONE // true ONE.equals(ONE) // true Чому? Лекція 3UML. Діаграми класів UML – це мова моделювання, яка використовується при аналізі та проектуванні програмних систем Увага:
Призначення UML Основні діаграми UMLВикористання (use-case) Класів (class) Станів (state chart) Діяльності (activity) Взаємодії
Діаграми спільної діяльності (collaboration) Пакетів (package) Фізичні діаграми Діаграми розгортання (deployment) Діаграми компонентів (component) Основні елементи діаграм класів UML. КласиКласи
Метод Успадкування Основні елементи діаграм класів UML. АсоціаціїАсоціація
Навігація Ролі Потужність Основні елементи діаграм класів UML. Абстрактні класи та інтерфейсиАбстрактні класи Інтерфейси Реалізація інтерфейсів Основні елементи діаграм класів UML. ОбмеженняЗа допомогою діаграм класів UML задаються наступні обмеження щодо правил побудови об’єктів:
На діаграмах відображаються графічно Динамічні обмеження Обмеження щодо значень атрибутів та асоціацій в залежності від різних умов Ці обмеження – це вирази, які повинні бути істинними для всіх екземплярів класу Задаються
неформально: природна мова На діаграмах показуються у { } Приклад діаграми класів UMLПриклад діаграми класів UML із навігацієюДеякі утиліти UMLOpen Source
ArgoUML StarUML Poseidon for UML Visual Paradigm SDE Community Edition
Enterprise Architect Power Designer Rational Rose Visual Paradigm Enterprise Edition
MS Visio ЛітератураThe Java Tutorial. http://download.oracle.com/javase/tutorial/java/TOC.html James Gosling, Bill Joy, Guy Steele. The Java Language Specification. - Addison Wesley. - 3 edition. - 2005. - 688p. -http://java.sun.com/docs/books/jls/ Брюс Эккель. Философия Java. – Питер, 2008. – 640 с. Java SE 6 Documentation http://download.oracle.com/javase/6/docs/ М. Фаулер, К.Скотт. UML. Основы. – СПб: Символ-Плюс, 2002. – 192 с. (доступна в djvu-формате) Марк Гранд. Шаблоны проектирования в Java. – М.: Новое знание, 2004. – 559с. (доступна в djvu-формате)
|