Слайд 1
Объектно-ориентированное программирование в Java
Лекция 3
Слайд 2План лекции
Введение
Принципы ООП
Этапы разработки программ
ООП в Java
Слайд 3Введение
Объектно-ориентированное программирование (ООП) - это технология создания программного обеспечения, основанная на
использовании совокупности программных объектов, каждый из которых является экземпляром определенного класса, при этом классы могут образовывать иерархию.
Класс можно определить как тип данных, который включает описание полей данных, а также методов (подпрограмм), работающих с этими полями данных.
Взаимодействие программных объектов в такой системе осуществляется с помощью передачи сообщений, реализуемой с помощью вызова процедур и функций.
Слайд 4Введение
Интуитивные определения основных понятий:
Объектом называется математическое представление сущности реального мира (или
предметной области), которое используется для моделирования.
Классом называется весьма общая сущность, которая
может быть определена как совокупность элементов.
Свойством (или атрибутом) называется
пропозициональная функция, определенная на
произвольном типе (данных).
Методом (или функцией) называется операция,
определенная над объектами некоторого класса.
Слайд 5Введение
Преимущества объектно-ориентированного подхода:
полное использование возможностей объектно-ориентированных языков программирования,
унификация разработки и
пригодность программ для повторного использования,
простота внесения изменений,
уменьшение риска неудачи при разработке сложных систем,
ориентированность на человеческое восприятие мира.
Слайд 6Введение
Основные работы в сфере моделирования ООП:
1924 – М.Шейнфинкель (Moses Shцnfinkel) разработал
теорию «простых» функций
1934 – А.Черч (Alonso Church) изобрел ламбда-исчисление и применил его в исследовании теории множеств
1971 – Д.Скотт (Dana S. Scott) предложил использовать полные и непрерывные решетки для формализации семантики (типизированного) ламбда-исчисления
1980-е – Д.Скотт (Dana S. Scott) и М.Фурман (Michael P. Fourman) исследовали аппарат определенных дескрипций как средство формализации определений
1990-е – В.Э.Вольфенгаген (Vyatcheslav E. Wolfengagen) предложил схему двухуровневой концептуализации для моделирования объектов предметных областей (и языков программирования); данная модель адекватна как для объектов данных (ОД), так и для объектов метаданных (ОМД)
Слайд 7Принципы ООП
абстрагирование
инкапсуляция
модульность
иерархичность
типизация
параллелизм
сохраняемость
Слайд 8Принципы ООП
Абстрагирование – принцип объектно-ориентированного программирования, который определяет правила выделения классов
и объектов и построения их объектных моделей.
Абстракция включает существенные для данной задачи характеристики некоторого объекта.
В объектно-ориентированном программировании все свойства абстракции, определяющие состояние и поведение анализируемого объекта, объединяются в единую программную единицу - класс.
Выделяют две части описания абстракции: интерфейс (доступные извне элементы абстракции - характеристики состояния и поведения) и реализация (недоступные извне элементы абстракции - внутренняя организация абстракции и механизмы осуществления ее поведения).
Слайд 9Принципы ООП
Инкапсуляция – принцип объектно-ориентированного программирования, который определяет объект как единое
целое и определяет интерфейс пользователя для использования объекта.
Инкапсуляция - объединение интерфейса и реализации в один класс, а также скрытие деталей реализации.
Модульность - принцип разработки программной системы, предполагающий ее реализацию в виде отдельных частей (модулей). Модули играют роль физических контейнеров, в которые помещаются описания классов и объектов.
Слайд 10Принципы ООП
Иерархичность предполагает использование иерархий (упорядоченных систем абстракций) при разработке программных
систем.
В ООП используют два вида иерархии:
«целое-часть»
«общее-частное»
«целое-часть»- некоторые абстракции включены в другую абстракцию как ее части. Этот вид иерархии используется в процессе разбиения системы на части на разных этапах проектирования
Слайд 11Принципы ООП
«общее-частное» - некоторая абстракция является частным случаем другой абстракции. Данный
вид иерархии используется при разработке структуры классов, когда сложные классы строятся на основе простых с помощью добавления к ним новых характеристик и изменения имеющихся. Этот механизм, являющийся в ООП одним из важнейших, называется наследованием.
Слайд 12Принципы ООП
Наследование - принцип объектно-ориентированного программирования, который реализует отношение обобщения между
классами.
Класс-потомок, наследующий характеристики другого класса, обладает теми же возможностями, что и класс-предок, от которого он порожден, при этом класс-предок остается без изменения, а классу-потомку можно добавлять новые элементы или изменять унаследованные. Благодаря этому потомок обладает большими возможностями, чем предок.
Все классы, используемые в Java, имеют общего предка - класс java.lang.Object.
Слайд 13Принципы ООП
Типизация - ограничения, накладываемые на объект и препятствующее взаимозаменяемости объектов
различных типов или уменьшающее возможность такой замены.
Слайд 14Принципы ООП
Тип может связываться с объектом во время компиляции (статическое или
раннее связывание) или во время выполнения программы (динамическое или позднее связывание). Динамическое связывание, а также наличие наследования позволяют реализовать важный механизм ООП - полиморфизм (одно и то же имя может означать объекты разных типов, но, имея общего предка, все они имеют и общее подмножество операций, которые можно над ними выполнять).
Слайд 15Принципы ООП
Полиморфизм – принцип объектно-ориентированого программирования, который позволяет за одним именем
метода закреплять несколько различных алгоритмов и реализаций.
Параллелизм - возможность нескольким абстракциям одновременно находиться в активном состоянии, выполняя некоторые операции.
Реальный параллелизм возможен только на многопроцессорных (многоядерных) системах, когда каждый процесс может выполняться отдельным процессором (ядром). На однопроцессорных (одноядерных) компьютерах параллелизм имитируется за счет механизма разделения времени между процессами (псевдопараллелизм).
Слайд 16Принципы ООП
Сохраняемость - способность объекта существовать во времени независимо от породившего
его процесса и/или в пространстве, возможно перемещаясь из своего первоначального адресного пространства.
На уровне программы по степени сохраняемости различают промежуточные результаты вычисления выражений, локальные переменные подпрограмм и глобальные объекты.
На уровне данных по степени сохраняемости выделяют данные, сохраняющиеся между сеансами выполнения программы, данные, сохраняемые при переходе на новую версию программы, а также данные, которые переживают программу.
Слайд 17Этапы разработки программы
анализ
проектирование
реализация
модификация
Слайд 18Этапы разработки программы
Цель первого этапа - максимально полное описание задачи. В
этот момент выполняют анализ предметной области, объектную декомпозицию и описывают абстракции. Результатом этапа является разработка диаграммы объектов, на которой показывают основные абстракции (объекты) предметной области и взаимодействие между ними.
Слайд 19Этапы разработки программы
Проектирование – это построение формализованного описания задачи, готового для
реализации.
При этом выполняют логическое (разработка структуры классов) и физическое (объединение реализаций классов в модули, определение способов взаимодействия с операционной системой, синхронизация процессов при параллельной обработке и т. д.) проектирование.
Результат этапа проектирования - это диаграмма классов (иерархия и состав классов), а также другие диаграммы, описывающие задачу.
Слайд 21Этапы разработки программы
Цель этапа реализации - получение программной системы, выполняющей заданные
функции.
Этап включает последовательную реализацию и подключение классов к проекту, создание работающего прототипа, а также постоянное тестирование и отладку.
Результатом этапа реализации является готовая программная система.
Цель этапа модификации - изменение существующей системы в соответствии с новыми требованиями.
Этот этап включает добавление новых элементов и модификацию существующих, при этом, как правило, меняется реализация, а не интерфейс.
Результатом модификации является измененная система.
Слайд 22ООП в Java
Объект — это мыслимая или реальная сущность, обладающая характерным
поведением и отличительными характеристиками и являющаяся важной в предметной области (Гради Буч)
Объектно-ориентированное программирование — парадигма программирования, в которой программа строится из взаимодействующих объектов
Слайд 23ООП в Java
Свойства объектов
Объект является экземпляром класса
Объект имеет внутреннее состояние
Объект может принимать сообщения (в большинстве языков сообщение = вызов метода)
Объект — это «умные данные»
Слайд 24ООП в Java
ООП в Java:
Поддержка ООП заложена в Java изначально (инкапсуляция,
наследование, полиморфизм)
В Java все является объектом, кроме примитивных типов
Исполняемый код может находиться только в классе
Стандартная библиотека предоставляет огромное количество классов, но можно свободно создавать свои
Слайд 25ООП в Java
Возможности ООП:
Инкапсуляция
Сокрытие деталей реализации за внешним интерфейсом
Наследование
Создание производных классов, наследующих свойства базового
Полиморфизм
Разная обработка сообщений в разных классах
Слайд 26ООП в Java
Объявление класса:
/* modifiers */ class Example {
/* class
content : fields and methods */ }
Слайд 27ООП в Java
Модификаторы можно разделить на две группы:
- модификаторы доступа,
-
модификаторы свойств.
Модификаторы доступа:
public - доступ для всех
protected - доступ в пределах пакета и дочерних классов
private - доступ в пределах класса по умолчанию (нет ключевого слова) доступ в пределах пакета
Слайд 28ООП в Java
Модификаторы свойств:
- final
- abstract
final class Example {...}
нельзя создать класс-наследник
final int getNumber() {...}
нельзя переопределить метод в дочернем классе
abstract class Example {...}
нельзя создать экземпляр класса
abstract int getNumber();
метод без реализации (класс должен быть абстрактным)
Слайд 29ООП в Java
Все составляющие класса называются его элементами или членами класса.
Обращение к отдельному элементу класса имеет синтаксис:
имя_объекта.имя_элемента.
Слайд 30ООП в Java
Вложенные классы:
Можно объявить класс внутри другого класса
Такие классы
имеют доступ к private-членам друг друга
Экземпляр вложенного класса связан с экземпляром внешнего класса
Если связь не нужна, вложенный класс объявляют с модификатором static
Слайд 31ООП в Java
Поля:
class Example {
/* modifiers */ int number ;
/* modifiers */ String text = " hello ";
}
Поля инициализируются значениями по умолчанию
Модификатор final — значение должно быть присвоено ровно один раз к моменту завершения инициализации экземпляра
Слайд 32ООП в Java
Методы:
class Example {
private int number ;
/* modifiers
*/ int getNumber () {
return number ;
}
}
Слайд 33ООП в Java
Имя метода в классе может быть неуникальным.
Существование в
классе методов с одинаковым именем называется перегрузкой, а сами одноименные методы называются перегруженными.
Перегрузка методов полезна, когда требуется решать однотипные задачи с разным набором параметров.
Перегруженные методы, имея одинаковое имя, должны обязательно отличаться либо числом параметров, либо их типами.
Слайд 34ООП в Java
Например, один класс может содержать такие перегруженные методы, позволяющие
определять максимум:
//максимум двух целых чисел int max(int a, int b);
//максимум трех целых чисел int max(int a, int b, int с);
//максимум целого числа и длины строки int max(int a,
string b);
//максимум чисел в строковом представлении int max(string a, string b);
Слайд 35ООП в Java
Существует несколько типов специальных методов:
- конструкторы,
- деструкторы,
- методы-свойства,
- индексаторы,
-
метод Main().
Слайд 36ООП в Java
Конструктор - обязательный элемент любого класса, предназначенный для инициализации
объекта, он вызывается автоматически при создании объекта класса с помощью операции new.
Имя конструктора всегда совпадает с именем класса. Хотя конструктор и является методом, он не возвращает значения (даже void)
Если в классе явно не задан ни один конструктор, то к классу автоматически добавляется конструктор по умолчанию - конструктор, вызываемый без параметров.
Класс может иметь несколько конструкторов с разными параметрами (это называется перегрузкой конструкторов).
Слайд 37ООП в Java
Конструкторы:
class Example {
private int number ;
/* modifiers
*/ Example (int number ) {
this . number = number ;
}
}
Слайд 38ООП в Java
Деструктор:
В Java нет деструкторов, сбор мусора автоматический
Есть метод
void finalize(), но пользоваться им не рекомендуется
При необходимости освободить ресурсы заводят обычный метод void close() или void dispose()
Слайд 39ООП в Java
Методы-свойства (Getters и Setters):
Для переменных класса модификатор доступа public нежелателен
т.к. он нарушает безопасность объекта.
Для защиты был придуман механизм доступа к переменным класса с помощью getи set (геттер и сеттер).
Get позволяет получить значения (читать значения)
Set - записать значения в переменную.
В коде они представляют собой обычные методы. Но имя метода всегда начинается с префикса get или set.
Слайд 40ООП в Java
Статические поля и методы:
class Example {
/* modifiers
*/ static final int DEFAULT_NUMBER = 333;
/* modifiers */ static int getDefaultNumber () {
return DEFAULT_NUMBER ;
}
}
Статические поля и методы относятся не к экземпляру класса, а ко всему классу
Слайд 41ООП в Java
Доступ к статическим членам:
int defaultNumber = Example . DEFAULT_NUMBER
;
// defaultNumber -> 333
defaultNumber = Example . getDefaultNumber ();
// defaultNumber -> 333
Example e = new Example (3);
// возможно, но не рекомендуется
defaultNumber = e. getDefaultNumber ();
// defaultNumber -> 333
Слайд 42ООП в Java
Доступ к статическим членам:
int defaultNumber = Example . DEFAULT_NUMBER
;
// defaultNumber -> 333
defaultNumber = Example . getDefaultNumber ();
// defaultNumber -> 333
Example e = new Example (3);
// возможно, но не рекомендуется
defaultNumber = e. getDefaultNumber ();
// defaultNumber -> 333
Слайд 43ООП в Java
Интерфейсы:
Интерфейс определяет возможные сообщения, но не их реализацию
interface
Interface1 {
int getNumber ();
}
Класс может реализовывать несколько интерфейсов
class Example implements Interface1 , Interface2 {
int getNumber () {
// implementation
}
// other methods
}
Слайд 44ООП в Java
Перечисления:
Класс с фиксированным количеством экземпляров
Может иметь поля и
методы
enum Direction {
LEFT ,
RIGHT ,
UP ,
DOWN
}
Слайд 45ООП в Java
Объявление класса-наследника:
class Derived extends Example {
/* derived class
content */
}
Java не поддерживает множественное наследование, но есть интерфейсы
Все классы наследуют java.lang.Object
Слайд 46ООП в Java
Конструктор класса-наследника:
class Derived extends Example {
Derived () {
this (10);
}
Derived (int number ) {
super ( number );
}
}
Слайд 47ООП в Java
Переопределение методов:
class Derived extends Example {
@Override
int getNumber
() {
int number = super . getNumber ();
return Math . max (10 , number );
}
}
Слайд 48ООП в Java
Пакеты (package)
Назначение:
Задание пространства имен, предотвращение коллизий имен классов
Логическая
группировка связанных классов
Сокрытие деталей реализации за счет модификаторов доступа
Слайд 49ООП в Java
Пакеты (package)
Задание пакета для класса:
package ru.lab.lab3;
Использование класса
из пакета:
- классы текущего пакета и пакета java.lang всегда видны
- классы других пакетов доступны по полному имени с пакетом
- можно использовать директиву import
Класс, принадлежащий пакету, должен лежать в одноименной директории:
ru/lab/lab3/
Слайд 50ООП в Java
Импорт
Импорт одного класса:
import ru.lab.lab3.ExampleClass;
Импорт всех классов пакета:
import ru.lab.lab3.*;
Импорт статических полей и методов:
import static java.lang.System.out;
import static java.util.Arrays.*;
Слайд 51ООП в Java
Импорт
Директивы import позволяют компилятору получить полные имена всех используемых
классов, полей и методов по их коротким именам
В class-файл попадают полные имена, подстановка содержимого не происходит
При запуске программы все используемые классы должны присутствовать в classpath