Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Заочники 2020-2021 / Лекция 4.ppt
Скачиваний:
67
Добавлен:
15.06.2021
Размер:
360.45 Кб
Скачать

Основы Java

МИЭТ, 2017

Лекция 4.

1.ООП в Java

Концепция ООП

Лекция 4

Концепция ООП появилась, как решение проблемы написания кода с приемлемым количеством ошибок за приемлимое время при условии все возрастающей сложности программ.

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

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

Итак, проблема — сложность. Нужно — упростить

Что нужно сделать?

Нужно уйти от общей области видимости переменных

Нужно уменьшить количество имен в программе

Нужно сохранить понятность и повторное использование кода

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

Концепция ООП

Лекция 4

Сравнение процедурного подхода и подхода ООП

 

 

Функциональный подход

 

Подход ООП

//Функция расчета периметра прямоуг-ка

//Суперкласс "Фигура"

float

function Rectangle_Perimeter(

public class figures {

float

a,

float b) {

}

 

}

return

2*(a+b);

//Класс прямоугольник от “Фигуры”

//Функция расчета периметра квадрата

class Rectangle extends figures {

 

public float x = 0, y = 0;

float

function Square_Perimeter(

 

float

a) {

 

Rectangle (float x, float y) {

}

return

Rectangle_Perimeter(a,a);

 

this.x = x;

 

 

 

 

}this.y = y;

//Функция расчета площади прямоугольника

 

float

function Rectangle_Area(

 

//Метод расчета периметра

float

a,

float b) {

 

}

return a*b;

 

public float getPerimetr() {

 

return 2*(x+y);

//Функция расчета площади квадрата

 

}

 

//Метод расчета площади

float

function Square_Area(

 

float

a) {

 

public float getArea() {

}

return

Rectangle_Area(a,a);

}

}return x*y;

 

 

 

 

 

 

 

 

 

//Класс квадрат от “Прямоугольника”

 

 

 

 

class Square extends Rectangle {

 

 

 

 

 

Square (float x) {

 

 

 

 

}

}super(x,x);

 

 

 

 

 

Потребовалось создать 4 функции

Потребовалось создать 2 метода

Концепция ООП

Лекция 4

Функциональный подход

Подход ООП

Вызов одной функции из другой до определенной степени

Класс (сущность) figure позволяет иерархически связать

можно назвать наследованием, но устройство процедурного

фигуры всех типов, обеспечивая, таким образом,

языка не обеспечивает никаких механизмов автоматизации

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

управления этим «наследованием».

программой большей сложности (содержащей больше

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

функций-методов), по сравнению с процедурным подходом.

Ключевое слвово extends позволяет создавать

дерева функций для структурирования и снижения

сложности программы подобно тому как оглавлление и

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

алфавитный указатель повышает скорость оперирование с

средствах разработки с перемещением по иерархии классов

большим текстом.

и подсказкой допустимых свойств и методов.

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

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

Например (для C++), некоторой структуры, которая бы

площади и периметра по иерархическому принципу с

хранила состояние программы.

помощью точеченой нотации: obj.getPerimeter(),

Линейность функций и управление с помощью данных

obj.getArea(), где obj – конкретная переменная экземпляр

объекта класса «прямоугольник» (Rectangle), созданная

делает невозможным создание функционально полных

выражением Rectangle obj = new Rectangle(x,y);.

«кирпичей программы». Максимум, что мы можем создать —

Управление объектом (подпрограммой) осуществляется с

линейные библиотеки функций, причем управление

функциями невозможно локализовать в этих библиотеках

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

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

Таким образом, класс — удобные кирпичик программы,

массивов и структур после импорта библиотек становятся

общими для программы

который содержит внутри себя и управление собою с

Сохранение промежуточных состояний осуществляется

сохранением промежуточных состояний и реализацию.

Поэтому классы еще называют пользовательскими типами

внешними по отношению к функции данными.

 

данных т. к. также как и простые типы данных они могут

 

примимать значения и имеют допустимые и недопустими

 

операции манипулирования с собою полностью

 

охватывающие требуемую функциональность.

Концепция ООП. Принципы

Лекция 4

Наследование:

Повторное использование кода

Удобство модификации

Экономия имен (за счет иерархической точечной нотации)

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

Защита переменных

Экономия имен (не нужное не видно)

Полиморфизм:

Повторное использование имен (значит — экономия имен)

Удобство модификации (перегрузка, переопределение)

Вцелом подход ООП можно охарактеризовать фразой - «Подальше положишь — поближе возьмешь». Чем более сложной становится программа, тем больший эффект дают первоначальные вложения труда в созданию объектной структуры.

Java в полной мере реализует базовые понятия ООП: инкапсуляция, наследование, полиморфизм. Поскольку язык Java разрабатывался уже в то время, когда подход ООП получил широкое распространение, реализация ООП в java имеет некоторые отличия объясняющиеся накопленным опытом применения ООП.

Отличие ООП в C++ и Java

Лекция 4

Харктеристика ООП

С++

Java

Инкапсуляция, наследование, полиморфизм

да

да

Модификаторы доступа public, private, protected

да

да

Модификатор static

да

да

Классы

да

да

Наследование от

базового класса

суперкласса

Множественное наследование (классов)

да

нет

Конструкторы

да

да

Конструктор копии

да

да

Вложенные и внутренние классы

да

да

Встраиваемые функции

да

нет

Перегрузка конструкторов

да

да

Параметризованные конструкторы

да

да

Перегрузка операторов

да

нет

Методы

да

да

Перегрузка методов

да

да

Отличие ООП в C++ и Java

Лекция 4

Харктеристика ООП

С++

Java

Метод, исполняющийся перед уничтожением класса

деструктор

финализатор

Предотвращение перегрузки методов

const

final

Передача объекта в класс

да

да

Возврат объекта из класса

да

да

Абстрактные классы

да

да

Обобщения типов

шаблоны

обобщения

Пакеты

нет

да

Интерфейсы

нет

да

Переменное число аргументов метода

нет

да

Динамическая диспетчеризация методов

вирт. функции

переопред. методы

Модули (Java 9)

нет

да

Отличие ООП в C++ и Java Лекция 4

1. Отказ от множественного наследования в Java

Проблема «ромба» B и C наследник A, D наследник B и C. У всех есть метод test. Какой выполнять в D?

Эта проблема разрешается в C++ с помощью применения оператора «::» для «ручного» указания версии базового класса метод или свойство которого используется. Например так: D.A::test(). Это требует внимательности. Неоднозначность всегда приводит к повышению сложности понимания кода программы.

2. Отказ от явных встраиваемых функций

В C++ существует понятие встраиваемых функций (inline). Это такие функции, вызовы которых в коде при компиляции заменяется на код функций. Программа в этом случае будет работать несколько быстрее.

В Java нет конструкции, которая бы позволяла разработчику рекомендовать компилятору сделать метод «встраиваемым» по аналогии с inline в C++. Компилятор Java самостоятельно определяет заменять ли в программе вызов функции её кодом или нет на основании своих внутренних инструкций. Известно, что можно увеличить вероятность того, что компилятор сделает метод встроенным, если он объявлен как static или final. Однако гарантии тут нет.

3. Отказ от перегрузки операторов в Java

Java исторически появилась позже C++, когда был накоплен значительный опыт в использовании концепции ООП и было доказано, что перегрузка операторов затрудняет читаемость кода и провоцирует большее число ошибок. Т.е. c точки зрения проектирования здесь оказалось не так много пользы, как на это рассчитывали. Например, с помощью переопределения операторов можно складывать объекты перегруженным арифметическим оператором «+», но по внешнему виду выражения совершенно нельзя догадаться какой будет результат.

Код Java исполняется интерпретатором JVM, и обработка перегруженных операторов работающих с объектами (а для другого они не нужны) замедлило бы исполнение программы и затруднило рефакторинг.

В Java существует только один переопределенный на уровне языка оператор «+», применяющийся для конкатенации строк.

Отличие ООП в C++ и Java

Лекция 4

1. Включение пакетов

Принцип Java один класс=один файл приводит к созданию большого количества файлов. Пакеты позволяют организовать автоматическую структуризацию классов программы.

2. Включение переменного числа аргументов

Поддержка переменного числа аргуметов в методах позволяет не создавать большое количество перегруженных методов, для случая, когда не все передаваемые аргументы являются обязательными для успешной работы метода. Т.е. В том случае, когда часть аргументов может отсутствовать. Необходимость в этом, часто возникает в работе по сети, когда вместе с обязательными аргументами, например, логино и паролем, могут передаваться или не передаваться и необязательные, например место жительства по IP.

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

массив элементов типа String с именем value:

void testMethod(String login, String password, String … value )

3. Включение интерфейсов

Интерфейсы применяются, как основное средство реализации полиморфизма в Java. Задача интерфейсов — описание того, «что должно быть реализовано». Таким образом, интерфейсы жестко определяют какие методы должны реализовывать классы, реализующие (наследующие) этот интерфейс. Как известно, в С++ для реализации полиморфизма используются абстрактные классы. Это также возможно и в Java. Но интерфейсы в Java подходят для этого лучше т. к. специально для этого разработаны с учетом накопившегося к появлению Java опыта использования ООП.

4. Включение модулей (с Java 9)

Модули позволяют разбить программу на еще большие изолированные блоки над пакетами и упорядочить зависимости, исключив случаи повторного импорта пакетов. Позволяют «вытаскивать» конкретные пакеты из других программ (модулей) с помощью описанных в файле описания модулей (module-info.java) зависимостей, без создания библиотек и любого другого прямого импорта пакетов. Это означает, что изменение в пакетах зависимых модулей автоматически становится доступным в целевом модуле.

Доп. см. https://habr.com/ru/company/jugru/blog/310368/

Классы в Java

Лекция 4

Классы в Java поддерживают:

1.Наследование от классов и интерфейсов

2.Идентификаторы доступа (инкапсуляция)

3.Абстрактные классы и методы

4.Вложенные и внутренние классы

5.Параметризованные перегружаемые конструкторы и методы с переменным числом аргументов

6.Передача и возврат объектов в конструкторы и методы

7.Динамическую диспетчеризацию методов

8.Метод finalize(), который вызывается перед окончательным удалением объекта из памяти

9.Ключевое слово this для разрешения ситуации сокрытия одноименных переменных

10.Ключевое слово final для запрета переопределения метода и/или наследования класса

11.Ключевое слово static для определения свойств и методов доступных без создания объекта

12.Статические блоки кода, для выполнения операций перед созданием объекта класса

Соседние файлы в папке Заочники 2020-2021