Лекция 6_принципы ООП : инкапсуляция, наследование
DESCRIPTION
http://spro-club.ruTRANSCRIPT
ПланИнкапсуляция
интерфейс объектаправила доступа к данным класса
Элементы классов и элементы объектовНаследование
отношения специализации и обобщенияссылка 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 `-- TestCats.java
Структура директорий, в которых хранятся файлы классов, должна соответствовать структуре пакетов.
При этом желательно файлы исходных кодов и файлы классов размещать отдельно, что повышает управляемость
Описание пакетаУказать имя пакета, в котором находится
класс, можно с помощью директивы packagepackage carspack;
Она должна быть самой первой командой в файле
До неё могут находиться только комментарии и пустые строки
Если директива package не указана в файле, то классы из него всё равно помещаются в пакет по умолчанию с именем default
Примечание: имена пакетов принято указывать в нижнем регистре
Директива importПозволяет включать один класс или все
классы пакета в текущий файлЭто позволяет использовать короткие
имена классовПример:
import java.util.Random; // подключение класса
import java.awt.*; // подключение всех классов пакета
ЗаданиеПросмотреть 2 презентацииИзучить примерРеализовать методы класса Ellipse для
вычисления площади и длиныСоздать класс Circle – круг – путём
наследования от класса Ellipse (на примере иерархии Rectangle->Square)