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)