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

21
Принципы ООП: инкапсуляция, наследование www.spro-club.ru

Upload: metaform

Post on 11-Nov-2014

7.805 views

Category:

Education


6 download

DESCRIPTION

http://spro-club.ru

TRANSCRIPT

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

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

www.spro-club.ru

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

ПланИнкапсуляция

интерфейс объектаправила доступа к данным класса

Элементы классов и элементы объектовНаследование

отношения специализации и обобщенияссылка superмодификатор protected

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

ИнкапсуляцияИнкапсуляция (И) (encapsulation) – «заключение

в капсулу» - ограничение доступа к содержимому «капсулы» извне и отсутствие такого ограничения внутри «капсулы»

И – один из основных принципов ООПИ - свойство языка программирования,

позволяющее пользователю не задумываться о сложности реализации используемого программного компонента (то, что у него внутри),

а взаимодействовать с ним посредством предоставляемого интерфейса (публичных методов и членов), а также объединить и защитить жизненно важные для компонента данные

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

Интерфейс объектаПри соблюдении принципа инкапсуляции

(И) пользователю предоставляется только спецификация (интерфейс) объектаПользователь может взаимодействовать с

объектом только через этот интерфейс. Реализуется с помощью ключевого слова: public

Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected

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

Правила доступа к данным классаСогласно принципу Инкапсуляции не

рекомендуется давать доступ к данным (переменным) класса напрямую извне

Пример открытых данных:public Rect {

public int x1, x2;}Rect r = new Rect();r.x1 = 10;

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

Правила доступа к данным классаРекомендуется закрывать все данные от прямого доступа

извне (с помощью модификатора private)Доступ к данным должен осуществляться через

специальные методы доступа (access methods) – «геттеры» (методы получения данных, Get) и «сеттеры» (методы установки данных, Set)

Метод-получатель (геттер) должен возвращать значение того же типа, что и само поле и не имеет параметров

Метод-присваиватель (сеттер) имеет тип void и принимает один параметр того же типа, что и само поле

Примечание: NetBeans умеет автоматически создавать методы доступа. Для этого в окне редактора кода в контекстном меню выберите пункт «Реорганизация кода» (Refactoring) и подпункт «Инкапсулировать поля»

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

Пример методов доступаПример:

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);

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

Применение инкапсуляции (И)И позволяет контролировать процессы

изменения и считывания данныхВ методы доступа можно встроить условия

проверкив присваивателе можно проверять

переданное значение на попадание в область допустимых значений

в получателе можно проверять, к примеру, права доступа к этим данным или вычислять значения и т.п.

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

Элементы класса и элементы объектаМетоды объектов пользуются (имеют доступ) полями

данных (атрибутами) объектовАтрибуты объекта – это обычные свойстваВызвать метод объекта можно только с помощью

объектной переменной. Без создания объекта это сделать нельзя

Методы класса могут пользоваться только атрибутами класса

Чтобы создать атрибуты и методы класса, достаточно поставить модификатор static перед этими элементами

Обратиться к элементам класса можно через имя класса, а не только через объект. Т.е. для этого создавать объект не нужно!

Но! Элементы класса («статические») не могут получать доступ к элементам объекта

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

Пример элементов классаМногие стандартные классы из библиотеки 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));

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

Специализация и обобщениеОтношение специализации в русском языке

выражается словом «является»Специализация – это уточнениеОдин объект является частным случаем другого

(один объект специализирует другой)Специализация – конкретизация или уточнениеПример: Сотрудник ОА является сотрудником

предприятия, программист является сотрудником ОА и т.д.

Обобщение – вид отношений, обратный специализации

Обобщение – переход на более абстрактный уровень

Например, «любой программист является человеком»

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

НаследованиеМеханизм построения иерархии классовИерархия – отношение «предок»->«потомок»

(родительский-дочерний классы, суперкласс-подкласс, порождающий-порождённый классы)

Каждый порожденный класс иерархии имеет доступ к коду и данным всех порождающих классов (к элементом, разрешённым установленной областью видимости)

Наследование – мощный механизм повторного использования программного кода

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

Наследование в JavaДля того, чтобы указать, что один класс

является потомком (производным) от другого класса, необходимо после его имени поставить ключевое слово extends и имя родительского класса:

public class дочерний_класс extends родительский_класс

{}Модификатор доступа protected позволяет

открыть члены класса всем потомкам этого класса, для остальных они остаются недоступными

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

Ссылка superВ чём-то похожа на thisСсылается на родительский классМожно применять двумя способами:

получать доступ к открытым (public) и защищённым (protected) элементам родительского класса например, super.x1 = 10;

вызывать конструктор родительского класса. Вызов конструктора родит.элемента super должен быть первым выражением в конструкторе дочернего элемента: public Square(Graphics g) { super(g); }

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

Модификатор protectedДелает элементы невидимыми извне

классаЭти элементы могут быть доступны в

дочерних классахв отличие от элементов с private-доступом,

кот. в дочерних классах не видны

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

Пример: иерархия геометрических фигурСреди геом.фигур можно выделить

отношения обобщения-специализацииНапример, квадрат является ромбом с

прямыми углами Квадрат является прямоугольником с

одинаковыми сторонамиКруг является эллипсом с одинаковыми

радиусами

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

Пакеты в JavaПакет (package) – это способ группировки

классов по функциональному назначениюПакеты Java обеспечивают уникальные

пространства именПакеты могут образовывать иерархическую

древовидную структуруПакет верхнего уровня проекта должен

иметь уникальное имя, не совпадающее с именами других глобальных пакетов проекта

Пакеты нижнего уровня обычно связаны с функциональным назначением классов, находящихся в данном пакете

Пакет, который содержит группу классов, объединяет их по некоторому смыслу

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

Пакеты в Java (продолжение)В пакет объединяются классы, сходные по

функциональному назначениюРеализуют принцип модульностиПолное имя класса включает имена пакета

и всех подпакетов, в котором он описанProject_DIR | |-- classes | `-- zoostore | |-- model | | `-- Cat.class | | | `-- test | `-- TestCats.class | `-- src `-- zoostore |-- model | `-- Cat.java | `-- test `-- TestCats.java

Структура директорий, в которых хранятся файлы классов, должна соответствовать структуре пакетов.

При этом желательно файлы исходных кодов и файлы классов размещать отдельно, что повышает управляемость

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

Описание пакетаУказать имя пакета, в котором находится

класс, можно с помощью директивы packagepackage carspack;

Она должна быть самой первой командой в файле

До неё могут находиться только комментарии и пустые строки

Если директива package не указана в файле, то классы из него всё равно помещаются в пакет по умолчанию с именем default

Примечание: имена пакетов принято указывать в нижнем регистре

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

Директива importПозволяет включать один класс или все

классы пакета в текущий файлЭто позволяет использовать короткие

имена классовПример:

import java.util.Random; // подключение класса

import java.awt.*; // подключение всех классов пакета

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

ЗаданиеПросмотреть 2 презентацииИзучить примерРеализовать методы класса Ellipse для

вычисления площади и длиныСоздать класс Circle – круг – путём

наследования от класса Ellipse (на примере иерархии Rectangle->Square)