www.spro-club.ru
План
 Инкапсуляция
    интерфейс объекта
    правила доступа к данным класса
 Элементы классов и элементы объектов
 Наследование
   отношения специализации и обобщения
   ссылка super
   модификатор protected
Инкапсуляция
 Инкапсуляция (И) (encapsulation) – «заключение в
  капсулу» - ограничение доступа к содержимому
  «капсулы» извне и отсутствие такого ограничения
  внутри «капсулы»
 И – один из основных принципов ООП
 И - свойство языка программирования,
  позволяющее пользователю не задумываться о
  сложности реализации используемого
  программного компонента (то, что у него внутри),
 а взаимодействовать с ним посредством
  предоставляемого интерфейса (публичных
  методов и членов), а также объединить и защитить
  жизненно важные для компонента данные
Интерфейс объекта
 При соблюдении принципа инкапсуляции (И)
 пользователю предоставляется только
 спецификация (интерфейс) объекта
   Пользователь может взаимодействовать с объектом
    только через этот интерфейс. Реализуется с
    помощью ключевого слова: public
   Пользователь не может использовать закрытые
    данные и методы. Реализуется с помощью ключевых
    слов: private, protected
Правила доступа к данным класса
 Согласно принципу Инкапсуляции не
  рекомендуется давать доступ к данным
  (переменным) класса напрямую извне
 Пример открытых данных:
   public Rect {
       public int x1, x2;
   }
   Rect r = new Rect();
   r.x1 = 10;
Правила доступа к данным класса
 Рекомендуется закрывать все данные от прямого доступа
    извне (с помощью модификатора private)
   Доступ к данным должен осуществляться через специальные
    методы доступа (access methods) – «геттеры» (методы
    получения данных, Get) и «сеттеры» (методы установки
    данных, Set)
   Метод-получатель (геттер) должен возвращать значение того
    же типа, что и само поле и не имеет параметров
   Метод-присваиватель (сеттер) имеет тип void и принимает
    один параметр того же типа, что и само поле
   Примечание: NetBeans умеет автоматически создавать
    методы доступа. Для этого в окне редактора кода в
    контекстном меню выберите пункт «Реорганизация кода»
    (Refactoring) и подпункт «Инкапсулировать поля»
Пример методов доступа
 Пример:
    public Rect {
        private int x1, x2;
        public int getX1() {
             return x1;
          }

        public void setX1(int x1) {
            this.x1 = x1;
          }
        }
    Rect r = new Rect();
    r.setX1(10);
Применение инкапсуляции (И)
 И позволяет контролировать процессы изменения
  и считывания данных
 В методы доступа можно встроить условия
  проверки
   в присваивателе можно проверять переданное
    значение на попадание в область допустимых
    значений
   в получателе можно проверять, к примеру, права
    доступа к этим данным или вычислять значения и
    т.п.
Элементы класса и элементы объекта
 Методы объектов пользуются (имеют доступ) полями
  данных (атрибутами) объектов
 Атрибуты объекта – это обычные свойства
 Вызвать метод объекта можно только с помощью объектной
  переменной. Без создания объекта это сделать нельзя

 Методы класса могут пользоваться только атрибутами класса
 Чтобы создать атрибуты и методы класса, достаточно
  поставить модификатор static перед этими элементами
 Обратиться к элементам класса можно через имя класса, а не
  только через объект. Т.е. для этого создавать объект не
  нужно!
 Но! Элементы класса («статические») не могут получать
  доступ к элементам объекта
Пример элементов класса
 Многие стандартные классы из библиотеки Java имеют методы и
  атрибуты класса («статические»)
 Например, в классе Math много таких элементов
 Можно пользоваться ими, не создавая объект типа Math:
    double x = Math.sqrt(9);
    double y = Math.PI;
 С помощью переменных класса удобно создавать константы.
  Например:
 public class Consts {
    public static final double PI = 3.14;
    public static double len(double r) { return 2*PI*r; }
 }
 System.out.print(“Число ПИ = “ + Consts.PI);
 System.out.print(“Длина окружности = “ + Consts.len(4));
Специализация и обобщение
 Отношение специализации в русском языке
    выражается словом «является»
   Специализация – это уточнение
   Один объект является частным случаем другого (один
    объект специализирует другой)
   Специализация – конкретизация или уточнение
   Пример: Сотрудник ОА является сотрудником
    предприятия, программист является сотрудником ОА и
    т.д.
   Обобщение – вид отношений, обратный
    специализации
   Обобщение – переход на более абстрактный уровень
   Например, «любой программист является человеком»
Наследование
 Механизм построения иерархии классов
 Иерархия – отношение «предок»->«потомок»
  (родительский-дочерний классы, суперкласс-
  подкласс, порождающий-порождённый классы)
 Каждый порожденный класс иерархии имеет доступ к
  коду и данным всех порождающих классов (к
  элементом, разрешённым установленной областью
  видимости)
 Наследование – мощный механизм повторного
  использования программного кода
Наследование в Java
 Для того, чтобы указать, что один класс является
    потомком (производным) от другого класса,
    необходимо после его имени поставить ключевое
    слово extends и имя родительского класса:
   public class дочерний_класс extends
    родительский_класс
   {
   }
   Модификатор доступа protected позволяет открыть
    члены класса всем потомкам этого класса, для
    остальных они остаются недоступными
Ссылка super
 В чём-то похожа на this
 Ссылается на родительский класс
 Можно применять двумя способами:
    получать доступ к открытым (public) и защищённым
     (protected) элементам родительского класса
       например, super.x1 = 10;
   вызывать конструктор родительского класса. Вызов
    конструктора родит.элемента super должен быть
    первым выражением в конструкторе дочернего
    элемента:
       public Square(Graphics g) { super(g); }
Модификатор protected
 Делает элементы невидимыми извне класса
 Эти элементы могут быть доступны в дочерних
  классах
 в отличие от элементов с private-доступом, кот. в
  дочерних классах не видны
Пример: иерархия
геометрических фигур
 Среди геом.фигур можно выделить отношения
  обобщения-специализации
 Например, квадрат является ромбом с прямыми
  углами
 Квадрат является прямоугольником с одинаковыми
  сторонами
 Круг является эллипсом с одинаковыми радиусами
Пакеты в Java
 Пакет (package) – это способ группировки классов
    по функциональному назначению
   Пакеты Java обеспечивают уникальные
    пространства имен
   Пакеты могут образовывать иерархическую
    древовидную структуру
   Пакет верхнего уровня проекта должен иметь
    уникальное имя, не совпадающее с именами других
    глобальных пакетов проекта
   Пакеты нижнего уровня обычно связаны с
    функциональным назначением классов,
    находящихся в данном пакете
   Пакет, который содержит группу классов,
    объединяет их по некоторому смыслу
Пакеты в Java (продолжение)
   В пакет объединяются классы, сходные по
    функциональному назначению
   Реализуют принцип модульности
   Полное имя класса включает имена пакета и всех
    подпакетов, в котором он описан
Project_DIR
   |
   |-- classes
   |       `-- zoostore                      Структура директорий, в которых
   |              |-- model                  хранятся файлы классов, должна
   |              |     `-- Cat.class
                                             соответствовать структуре
   |              |
   |              `-- test                   пакетов.
   |                    `-- TestCats.class
   |                                         При этом желательно файлы
   `-- src
        `-- zoostore
                                             исходных кодов и файлы классов
                |-- model                    размещать отдельно, что
                |     `-- Cat.java           повышает управляемость
                |
                `-- test
Описание пакета
 Указать имя пакета, в котором находится класс,
 можно с помощью директивы package
   package carspack;
 Она должна быть самой первой командой в файле
 До неё могут находиться только комментарии и
  пустые строки
 Если директива package не указана в файле, то
  классы из него всё равно помещаются в пакет по
  умолчанию с именем default
 Примечание: имена пакетов принято указывать в
  нижнем регистре
Директива import
 Позволяет включать один класс или все классы
  пакета в текущий файл
 Это позволяет использовать короткие имена
  классов
 Пример:
   import java.util.Random; // подключение класса
   import java.awt.*; // подключение всех классов пакета
Задание
 Просмотреть 2 презентации
 Изучить пример
 Реализовать методы класса Ellipse для вычисления
  площади и длины
 Создать класс Circle – круг – путём наследования от
  класса Ellipse (на примере иерархии Rectangle-
  >Square)

Лекция 6_принципы ООП : инкапсуляция, наследование

  • 1.
  • 2.
    План  Инкапсуляция  интерфейс объекта  правила доступа к данным класса  Элементы классов и элементы объектов  Наследование  отношения специализации и обобщения  ссылка super  модификатор protected
  • 3.
    Инкапсуляция  Инкапсуляция (И)(encapsulation) – «заключение в капсулу» - ограничение доступа к содержимому «капсулы» извне и отсутствие такого ограничения внутри «капсулы»  И – один из основных принципов ООП  И - свойство языка программирования, позволяющее пользователю не задумываться о сложности реализации используемого программного компонента (то, что у него внутри),  а взаимодействовать с ним посредством предоставляемого интерфейса (публичных методов и членов), а также объединить и защитить жизненно важные для компонента данные
  • 4.
    Интерфейс объекта  Присоблюдении принципа инкапсуляции (И) пользователю предоставляется только спецификация (интерфейс) объекта  Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью ключевого слова: public  Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected
  • 5.
    Правила доступа кданным класса  Согласно принципу Инкапсуляции не рекомендуется давать доступ к данным (переменным) класса напрямую извне  Пример открытых данных:  public Rect {  public int x1, x2;  }  Rect r = new Rect();  r.x1 = 10;
  • 6.
    Правила доступа кданным класса  Рекомендуется закрывать все данные от прямого доступа извне (с помощью модификатора private)  Доступ к данным должен осуществляться через специальные методы доступа (access methods) – «геттеры» (методы получения данных, Get) и «сеттеры» (методы установки данных, Set)  Метод-получатель (геттер) должен возвращать значение того же типа, что и само поле и не имеет параметров  Метод-присваиватель (сеттер) имеет тип void и принимает один параметр того же типа, что и само поле  Примечание: NetBeans умеет автоматически создавать методы доступа. Для этого в окне редактора кода в контекстном меню выберите пункт «Реорганизация кода» (Refactoring) и подпункт «Инкапсулировать поля»
  • 7.
    Пример методов доступа Пример:  public Rect {  private int x1, x2;  public int getX1() {  return x1;  }  public void setX1(int x1) {  this.x1 = x1;  }  }  Rect r = new Rect();  r.setX1(10);
  • 8.
    Применение инкапсуляции (И) И позволяет контролировать процессы изменения и считывания данных  В методы доступа можно встроить условия проверки  в присваивателе можно проверять переданное значение на попадание в область допустимых значений  в получателе можно проверять, к примеру, права доступа к этим данным или вычислять значения и т.п.
  • 9.
    Элементы класса иэлементы объекта  Методы объектов пользуются (имеют доступ) полями данных (атрибутами) объектов  Атрибуты объекта – это обычные свойства  Вызвать метод объекта можно только с помощью объектной переменной. Без создания объекта это сделать нельзя  Методы класса могут пользоваться только атрибутами класса  Чтобы создать атрибуты и методы класса, достаточно поставить модификатор static перед этими элементами  Обратиться к элементам класса можно через имя класса, а не только через объект. Т.е. для этого создавать объект не нужно!  Но! Элементы класса («статические») не могут получать доступ к элементам объекта
  • 10.
    Пример элементов класса Многие стандартные классы из библиотеки Java имеют методы и атрибуты класса («статические»)  Например, в классе Math много таких элементов  Можно пользоваться ими, не создавая объект типа Math:  double x = Math.sqrt(9);  double y = Math.PI;  С помощью переменных класса удобно создавать константы. Например:  public class Consts {  public static final double PI = 3.14;  public static double len(double r) { return 2*PI*r; }  }  System.out.print(“Число ПИ = “ + Consts.PI);  System.out.print(“Длина окружности = “ + Consts.len(4));
  • 11.
    Специализация и обобщение Отношение специализации в русском языке выражается словом «является»  Специализация – это уточнение  Один объект является частным случаем другого (один объект специализирует другой)  Специализация – конкретизация или уточнение  Пример: Сотрудник ОА является сотрудником предприятия, программист является сотрудником ОА и т.д.  Обобщение – вид отношений, обратный специализации  Обобщение – переход на более абстрактный уровень  Например, «любой программист является человеком»
  • 12.
    Наследование  Механизм построенияиерархии классов  Иерархия – отношение «предок»->«потомок» (родительский-дочерний классы, суперкласс- подкласс, порождающий-порождённый классы)  Каждый порожденный класс иерархии имеет доступ к коду и данным всех порождающих классов (к элементом, разрешённым установленной областью видимости)  Наследование – мощный механизм повторного использования программного кода
  • 13.
    Наследование в Java Для того, чтобы указать, что один класс является потомком (производным) от другого класса, необходимо после его имени поставить ключевое слово extends и имя родительского класса:  public class дочерний_класс extends родительский_класс  {  }  Модификатор доступа protected позволяет открыть члены класса всем потомкам этого класса, для остальных они остаются недоступными
  • 14.
    Ссылка super  Вчём-то похожа на this  Ссылается на родительский класс  Можно применять двумя способами:  получать доступ к открытым (public) и защищённым (protected) элементам родительского класса  например, super.x1 = 10;  вызывать конструктор родительского класса. Вызов конструктора родит.элемента super должен быть первым выражением в конструкторе дочернего элемента:  public Square(Graphics g) { super(g); }
  • 15.
    Модификатор protected  Делаетэлементы невидимыми извне класса  Эти элементы могут быть доступны в дочерних классах  в отличие от элементов с private-доступом, кот. в дочерних классах не видны
  • 16.
    Пример: иерархия геометрических фигур Среди геом.фигур можно выделить отношения обобщения-специализации  Например, квадрат является ромбом с прямыми углами  Квадрат является прямоугольником с одинаковыми сторонами  Круг является эллипсом с одинаковыми радиусами
  • 17.
    Пакеты в Java Пакет (package) – это способ группировки классов по функциональному назначению  Пакеты Java обеспечивают уникальные пространства имен  Пакеты могут образовывать иерархическую древовидную структуру  Пакет верхнего уровня проекта должен иметь уникальное имя, не совпадающее с именами других глобальных пакетов проекта  Пакеты нижнего уровня обычно связаны с функциональным назначением классов, находящихся в данном пакете  Пакет, который содержит группу классов, объединяет их по некоторому смыслу
  • 18.
    Пакеты в Java(продолжение)  В пакет объединяются классы, сходные по функциональному назначению  Реализуют принцип модульности  Полное имя класса включает имена пакета и всех подпакетов, в котором он описан Project_DIR | |-- classes | `-- zoostore Структура директорий, в которых | |-- model хранятся файлы классов, должна | | `-- Cat.class соответствовать структуре | | | `-- test пакетов. | `-- TestCats.class | При этом желательно файлы `-- src `-- zoostore исходных кодов и файлы классов |-- model размещать отдельно, что | `-- Cat.java повышает управляемость | `-- test
  • 19.
    Описание пакета  Указатьимя пакета, в котором находится класс, можно с помощью директивы package  package carspack;  Она должна быть самой первой командой в файле  До неё могут находиться только комментарии и пустые строки  Если директива package не указана в файле, то классы из него всё равно помещаются в пакет по умолчанию с именем default  Примечание: имена пакетов принято указывать в нижнем регистре
  • 20.
    Директива import  Позволяетвключать один класс или все классы пакета в текущий файл  Это позволяет использовать короткие имена классов  Пример:  import java.util.Random; // подключение класса  import java.awt.*; // подключение всех классов пакета
  • 21.
    Задание  Просмотреть 2презентации  Изучить пример  Реализовать методы класса Ellipse для вычисления площади и длины  Создать класс Circle – круг – путём наследования от класса Ellipse (на примере иерархии Rectangle- >Square)