Ім'я файлу: Java.ppt
Розширення: ppt
Розмір: 1346кб.
Дата: 08.12.2020
скачати
Пов'язані файли:
БДSQL.pptx

Мова програмування 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, super


public class User{
private String name;
  public static generatePassword () {
    return name + “password”;
  }
}




Лекція 3





UML. ООП у мові Java

Принципи парадигми ООП





Абстракція - приховати деталі та бачити головне
Механізми, що реалізують поняття “абстракція” у ООП
    Успадкування
      Ієрархії класів

      Інкапсуляція

      Поєднання даних та методів в одному об’єкті
      Приховування деталей реалізації

      Поліморфізм

      Перекриття методів у класах-нащадках


Найчастіші помилки при використанні ООП




УСПАДКУВАННЯ




Успадкування





Що можна зробити за допомогою успадкування:
    Створити новий клас на основі базового
    Додати нові поля та методи
    Додати нові статичні поля та методи
    Мати доступ до полів та методів базового класу згідно модифікаторам доступу
    Перекрити методи

    Види успадкування (мається на увазі успадкуванні реалізацій):

    Одиночне – успадкування тільки одного базового класу (Java, C#)
    Множинне – успадкування декількох базових класів (C++)

    Альтернативна термінологія

    Клас-пращур = базовий клас = супер-клас
    Клас-нащадок = похідний клас = під-клас

    Зв’язок з теорією множин

    Відношення ієрархії класів ABC
    Відношення включення множин ABC

Успадкування в Java





Мова Java підтримує
    одиночне успадкування класів - extends
    множинне успадкування інтерфейсів - 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 A {…}
    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. super


this – доступ до поточного класу (до полів, методів)
super – доступ до
    Базового класу (до конструкторів, полів, методів)
    До перекритих методів базового класу
    До прихованих полів та методів базового класу

    this/super не можуть застосовуватись у static-методах



Виклик конструктора





Явний виклик конструктора базового класу
    class Bike {
    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





Задача інкапсуляції - приховати, як влаштований об’єкт
    Отримання стану об’єкту здійснюється за допомогою публічних методів
    Зміна об’єкта здійснюється тільки за допомогою публічних методів

    Приклад інкапсуляції:

    стек із операціями додавання/виштовхування із стеку та методом для отримання верхнього елементу стеку
      class Stack {
      ...
      public void push(int x) {...}
      public int pop() {...}
      public int getTop() {...}
      }

    Інкапсуляція в Java реалізується за допомогою:

    застосування модифікаторів доступу до полів та методів
    інкапсуляції полів шляхом реалізації методів get/set

Модифікатори доступу





Модифікатори можуть обмежити доступ до:
    Класів/Інтерфейсів
    Вкладених класів
    Конструкторів
    Полів
    Методів

Області видимості


Модификатор


Той самий клас


Той самий пакет


Похідний клас
(можливо із іншого пакету)


Класи із інших пакетів


private


+


не вказано (default)


+


+


+ (тільки якщо в тому самому пакеті)


protected


+


+


+


public


+


+


+


+





Зверніть увагу на порядок модифікаторів – зручний для сприйняття

Інкапсуляція полів. Методи get/set





Інкапсуляція полів
    поле - private/protected
    “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-методи – статичне (раннє) зв’язування, на етапі компіляції
    Інші методи – динамічне (пізнє) зв’язування, на етапі виконання

Які модифікатори забороняють перекриття методу


Модифікатор, який забороняє перекриття методу
    final

    Інші модифікатори, які не дозволяють перекриття методів

    static
    private




Сигнатури методів





Методи f та g мають однакову сигнатуру, якщо вони мають
    Однакову назву
    Однакову кількість аргументів
    Однакові типи аргументів

    Увага. Поняття сигнатури не містить типу значень, що повертаються!
    Для generic: cигнатура методу f є підсигнатурою методу g, якщо

    Сигнатури методів f та g однакові
    Або, якщо f параметризовано: після видалення параметрів у сигнатурі методу f, сигнатури f та g є однаковими

    Сигнатура методу f є еквівалентною сигнатурі методу g, якщо

    Сигнатура методу f є підсигнатурою g та сигнатура методу g є підсигнатурою f

    Увага

    у мові Java на відміну від C++ при порівнянні сигнатур не враховуються похідні типи. Тому помилково замість перекриття методів програміст виконує перевантаження.


Якщо у одному класі визначено два методи з однаковою/еквівалентною сигнатурою, то помилка компіляції
    Приклад 1:
    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
    сигнатура методу c є підсигнатурою методу a
    Метод a у батьківському класі має модифікатор доступу public, protected, не_вказано
    видимість методу у класі-нащадку не звужується (див. таблицю нижче)
    виконуються вимоги щодо типів значень, що повертається у методі похідного класу (*)
    Виконуються вимоги щодо виключних ситуацій, що генеруються в методі. Кількість виключних ситуацій в секції throws не може збільшуватись. Типи виключних ситуацій можуть уточнюватись (*)
    * визначено далі


Модифікатор доступу у базовому класі


Модифікатор доступу у похідному класі


public


public


protected


protected public


не_вказано


будь-який, окрім private

Вимоги до перекриття та приховування методів




Приховування полів та методів





Приховування полів
    Поле похідного класу приховує доступні поля із базових класів чи інтерфейсів
      із таким самим ім’ям при цьому співпадіння типів не обов’язкове

      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(boolean b)
      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
      public abstract class Line {…)

    Абстрактний метод

    Не має реалізації
    Має модифікатор abstract
      abstract void foo();

    Приклад

      public abstract class Line {
      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-методів. Приклад:
    public interface Buffer {
    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 не застосовується до методів із модифікаторами
    private
    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 “внутрішні”

      пов’язані з екземпляром зовнішнього класу

    class OuterClass {
    ...
    static class StaticNestedClass{...}
    class InnerClass { ... }
    }

Статичні вкладені класи





Статичний вкладений клас:
    Не пов’язаний з екземпляром зовнішнього класу

    Доступ до статичних вкладених класів:

    class OuterClass {
    ...
    class StaticNestedClass {…}
    }
    OuterClass.StaticNestedClass

    Створення об’єкту такого класу

    OuterClass.StaticNestedClass o;
    o = new OuterClass.StaticNestedClass();

Внутрішні класи





Внутрішній клас
    завжди пов’язаний із екземпляром зовнішнього класу не може мати static-методів
      Питання до аудиторії - чому?

      екземпляр внутрішнього класу існує тільки “в рамках” екземпляру зовнішнього класу має прямий доступ до членів зовнішнього класу (див. приклад)
    Створення:
    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); // без допоміжних ключових слів
    }
    }
    }

Вкладені класи. Модифікатори доступу





Модифікатори доступу до вкладених класів:
    Зверніть увагу: на відміну від класів верхнього рівня, які мають тільки модифікатори доступу «public» «не_вказано», вкладені класи мають усі модифікатори доступу:
      private protected public не_вказано

    Вкладені класи, що визначені у інтерфейсах, неявно мають модифікатори public static

    Питання до аудиторії – чому?

    Вкладені інтерфейси завжди неявно мають модифікатор 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)





    Нехай E – назва enum-типу

    “Вбудовані” методи для роботи з 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
Чому?




Лекція 3





UML. Діаграми класів





UML – це мова моделювання, яка використовується при аналізі та проектуванні програмних систем
Увага:
    При виконанні лабораторної роботи №3 у звіті необхідно навести діаграму класів


Призначення UML

Основні діаграми UML





Використання (use-case)
Класів (class)
Станів (state chart)
Діяльності (activity)
Взаємодії
    Діаграми послідовності (sequence)
    Діаграми спільної діяльності (collaboration)

    Пакетів (package)
    Фізичні діаграми

    Діаграми розгортання (deployment)
    Діаграми компонентів (component)

Основні елементи діаграм класів UML. Класи





Класи
    Атрибут
    Метод

    Успадкування

Основні елементи діаграм класів UML. Асоціації





Асоціація
    Тип асоціації
    Навігація
    Ролі
    Потужність

Основні елементи діаграм класів UML. Абстрактні класи та інтерфейси





Абстрактні класи
Інтерфейси
Реалізація інтерфейсів

Основні елементи діаграм класів UML. Обмеження





За допомогою діаграм класів UML задаються наступні обмеження щодо правил побудови об’єктів:
    Статичні обмеження
      Успадкування, потужність, обов’язковість асоціацій
      На діаграмах відображаються графічно

      Динамічні обмеження

      Обмеження щодо значень атрибутів та асоціацій в залежності від різних умов
      Ці обмеження – це вирази, які повинні бути істинними для всіх екземплярів класу
      Задаються
        формально: Object Constraint Language (OCL)
        неформально: природна мова

        На діаграмах показуються у { }

Приклад діаграми класів UML




Приклад діаграми класів UML із навігацією




Деякі утиліти UML





Open Source
    AndroMDA
    ArgoUML
    StarUML
    Poseidon for UML
    Visual Paradigm SDE Community Edition
      Plugin for Netbeans, Eclipse, IDEA, Visual Studio

    Комерційні реалізації

    Enterprise Architect
    Power Designer
    Rational Rose
    Visual Paradigm Enterprise Edition
      Plugin for Netbeans, Eclipse, IDEA, Visual Studio

      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-формате)
    Глава 2. Обзор UML


скачати

© Усі права захищені
написати до нас