ООП в . Лекция 3

Содержание

Слайд 2

План

Геттеры и сеттеры
Переопределение методов
Абстрактные классы Java
Ключевое слово Java final
Статические переменные Java
Статические методы

План Геттеры и сеттеры Переопределение методов Абстрактные классы Java Ключевое слово Java
Java
Статический блок Java
Java static import
Класс Object и методы класса Object
Интерфейс

Слайд 3

Геттеры и сеттеры

Если переменная имеет уровень доступа private, к ней невозможно обратиться

Геттеры и сеттеры Если переменная имеет уровень доступа private, к ней невозможно
извне класса, в котором она объявлена. Но все равно необходим способ обращения к private переменным из другого класса, иначе такие изолированные переменные не будут иметь смысла. Это достигается с помощью объявления специальных public методов. Методы, которые возвращают значение переменных, называются геттеры. Методы, которые изменяют значение свойств, называются сеттеры.

Слайд 4

Геттеры и сеттеры

Существуют правила объявления таких методов, рассмотрим их:
Если свойство НЕ типа

Геттеры и сеттеры Существуют правила объявления таких методов, рассмотрим их: Если свойство
boolean, префикс геттера должно быть get. Например: getName() это корректное имя геттера для переменной name.
Если свойство типа boolean, префикс имени геттера может быть get или is. Например, getPrinted() или isPrinted() оба являются корректными именами для переменных типа boolean.
Имя сеттера должно начинаться с префикса set. Например, setName() корректное имя для переменной name.

Слайд 5

Геттеры и сеттеры

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

Геттеры и сеттеры Для создания имени геттера или сеттера, первая буква свойства
большую и прибавлена к соответствующему префиксу (set, get или is).
Для создания имени геттера или сеттера, первая буква свойства должна быть изменена на большую и прибавлена к соответствующему префиксу (set, get или is). Сеттер должен быть public, возвращать void тип и иметь параметр соответствующий типу переменной. Например:

Слайд 6

Геттеры и сеттеры

Геттер метод должен быть public, не иметь параметров метода, и

Геттеры и сеттеры Геттер метод должен быть public, не иметь параметров метода,
возвращать значение соответствующее типу свойства. Например:

Слайд 7

Геттеры и сеттеры

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

Геттеры и сеттеры В языке Java при проектировании классов принято ограничивать уровень
к переменным с помощью модификаторов private или protected и обращаться к ним через геттеры и сеттеры.
Существует также такое понятие как JavaBeans классы - это классы содержащие свойства. В Java мы можем рассматривать свойства как private переменные класса. Так как они private, доступ к ним извне класса может быть осуществлен только с помощью методов класса.
Рассмотрим пример реализации концепции JavaBeans на классе Person, у которого есть три переменные. Они объявлены как private и доступ к ним возможен только через соответствующие геттеры и сеттеры.

Слайд 8

Геттеры и сеттеры

Геттеры и сеттеры

Слайд 9

Геттеры и сеттеры

Геттеры и сеттеры делают код более громоздким, поэтому часто задается

Геттеры и сеттеры Геттеры и сеттеры делают код более громоздким, поэтому часто
вопрос о том, можно ли обойтись без них. Объясню их необходимость на следующих двух примерах.
Рассмотрим класс CircleWrong, у которого две переменные - радиус и диаметр, объявленные с уровнем доступа по умолчанию.

Слайд 10

Геттеры и сеттеры

Любой класс в том же пакете может обратится к ним

Геттеры и сеттеры Любой класс в том же пакете может обратится к
напрямую и изменить их значение. Значения этих двух переменных должно соответствовать друг другу, но пользователь этого класса может задать любые значения, например:

Слайд 11

Геттеры и сеттеры

Это может привести к неправильным дальнейшим вычислениям. Перепишем этот класс

Геттеры и сеттеры Это может привести к неправильным дальнейшим вычислениям. Перепишем этот
с использованием концепции JavaBeans, но немного изменим сеттеры. Метод setRadius() вместе с радиусом задает правильное значение для диаметра. Метод setDiam() написан соответствующим образом.

Слайд 12

Геттеры и сеттеры

Пользователь данного класса не может напрямую добраться к переменным, доступ

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

Слайд 13

Геттеры и сеттеры

В следующем примере рассмотрим возможности геттера. Класс User содержит две

Геттеры и сеттеры В следующем примере рассмотрим возможности геттера. Класс User содержит
переменные - логин и пароль. Пароль содержит чувствительную информацию, которую не рекомендуется показывать. Достигается это с помощью объявления переменной с модификатором private и доступом к ней только через геттер метод, в котором вместо полного пароля показываем только первую букву, а остальные заменяются звездочками.

Слайд 14

Геттеры и сеттеры

Результат выполнения:

Геттеры и сеттеры Результат выполнения:

Слайд 15

Переопределение методов

Если в иерархии классов совпадают имена и сигнатуры типов методов из

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

Слайд 16

Переопределение методов

В следующем примере в классе M определен метод print(). В его

Переопределение методов В следующем примере в классе M определен метод print(). В
наследнике классе N тоже определен метод print() с такой же сигнатурой, но другим поведением. Это и называется переопределением методов:

Слайд 17

Переопределение методов

Когда переопределенный метод вызывается из своего подкласса, он всегда ссылается на

Переопределение методов Когда переопределенный метод вызывается из своего подкласса, он всегда ссылается
свой вариант, определенный в подклассе. А вариант метода, определенный в суперклассе, будет скрыт. Из метода someMethod() будет вызван метод того же класса N.

Слайд 18

Создадим три объекта и для каждого вызовем метод print().
Первая переменная obj1 типа

Создадим три объекта и для каждого вызовем метод print(). Первая переменная obj1
M указывает на объект того же типа M. При вызове метода print() ожидаемо вызовется метод класса M. Вторая переменная obj2 типа N указывает на объект N. При вызове метода print() вызовется метод класса N. Третий вариант самый интересный - переменная obj3 типа M, но указывает на объект N. Какой же метод print() будет использоваться здесь? Выбор необходимого переопределенного метода выбирается JVM на основе ТИПА ОБЪЕКТА, а не типа переменной!!! Поэтому для переменной obj3 вызовется метод класса N.

Переопределение методов

Слайд 19

Результат выполнения:

Переопределение методов

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

Слайд 20

Существует такое понятие в Java как динамическая диспетчеризация методов - это механизм,

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

Переопределение методов

Слайд 21

Рассмотрим более конкретный пример, который показывает зачем переопределяются методы.
Создадим класс Figure, описывающий

Рассмотрим более конкретный пример, который показывает зачем переопределяются методы. Создадим класс Figure,
какую-то абстрактную фигуру и классы наследники Triangle и Rectangle. Класс Figure содержит метод area(), подсчитывающий площадь фигуры. У каждой фигуры своя формула для подсчета площади, поэтому в классах Triangle и Rectangle метод area() переопределяется соответствующим образом.

Переопределение методов

Слайд 22

Переопределение методов

Переопределение методов

Слайд 23

Создадим массив типа Figure, который будет содержать объекты типа Figure, Triangle и

Создадим массив типа Figure, который будет содержать объекты типа Figure, Triangle и
Rectangle. Подсчитаем площадь для каждого элемента перебирая элементы массива и вызывая метод area() для каждого элемента. Нам все равно какого типа объект - у каждого есть вызываемый метод area(). JVM с помощью динамической диспетчеризации выбирает нужный вариант метода, основываясь на реальном типе объекта:

Переопределение методов

Слайд 24

Результат выполнения кода:

Переопределение методов

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

Слайд 25

После выхода Java 5 появилась возможность при переопределении методов указывать другой тип

После выхода Java 5 появилась возможность при переопределении методов указывать другой тип
возвращаемого значения, в качестве которого можно использовать только типы, находящиеся ниже в иерархии наследования, чем исходный тип. Такие типы еще называются ковариантными.
Например, класс S наследует класс R и переопределяет метод getInstance(). При переопределении возвращаемый тип метода может или остаться таким же - Box6, или быть изменен на любого наследника класса Box6 - HeavyBox, ColorBox или Shipment:

Переопределение методов

Слайд 26

Статические методы не могут быть переопределены. Класс наследник может объявлять метод с

Статические методы не могут быть переопределены. Класс наследник может объявлять метод с
такой же сигнатурой, что и суперкласс, но это не будет переопределением. При вызове переопределенного метода JVM выбирает нужный вариант основываясь на типе объекта. Вызов же статического метода происходит без объекта. Версия вызываемого статического метода всегда определяется на этапе компиляции.
При использовании ссылки для доступа к статическому члену компилятор при выборе метода учитывает тип ссылки, а не тип объекта, ей присвоенного.

Переопределение методов

Слайд 27

Создадим в суперклассе и наследнике статические методы с одинаковой сигнатурой:

Переопределение методов

Создадим в суперклассе и наследнике статические методы с одинаковой сигнатурой: Переопределение методов

Слайд 28

Попробуем вызвать статический метод используя переменную типа Base, которая указывает на объект

Попробуем вызвать статический метод используя переменную типа Base, которая указывает на объект
типа Sub. При вызове статического метода JVM найдет тип переменной и вызовет метод того же класса:

Переопределение методов

Результат выполнения:

Слайд 29

Методы объявленные как private никто, кроме самого класса не видит. Поэтому их

Методы объявленные как private никто, кроме самого класса не видит. Поэтому их
наличие/отсутствие никак не отражается на классах-наследниках. Они с легкостью могут объявлять методы с такой же сигнатурой и любыми модификаторами. Но это плохой тон! Также класс наследник может расширить видимость protected метода до public. Сузить видимость класс-наследник не может.

Переопределение методов

Слайд 30

Необязательная аннотация @Override используется с методом для указания того, что он переопределен.

Необязательная аннотация @Override используется с методом для указания того, что он переопределен.
Если метод переопределен неверно, код не скомпилируется:

Переопределение методов

Слайд 31

Абстрактные методы – это методы у которых отсутствует реализация.
Общая форма:
Пример:

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

Абстрактные методы – это методы у которых отсутствует реализация. Общая форма: Пример: Абстрактные классы Java

Слайд 32

Абстрактные методы должны быть обязательно переопределены в подклассе.
Любой класс, содержащий один или

Абстрактные методы должны быть обязательно переопределены в подклассе. Любой класс, содержащий один
больше абстрактных методов, должен быть также объявлен как абстрактный. Для этого достаточно указать ключевое слово abstract перед ключевым словом class в начале объявления класса:

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

Слайд 33

У абстрактного класса в Java не может быть никаких объектов. Но абстрактные

У абстрактного класса в Java не может быть никаких объектов. Но абстрактные
классы можно применять для создания ссылок на объекты. Например:

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

Слайд 34

Также нельзя объявлять абстрактные конструкторы или абстрактные статические методы.
Рассмотрим пример использования абстрактных

Также нельзя объявлять абстрактные конструкторы или абстрактные статические методы. Рассмотрим пример использования
классов и методов на примере класса Figure и его наследников Triangle и Rectangle, которые мы рассматривали в Переопределение методов. Класс Figure описывает абстрактную фигуру, для которой вычисление площади не имеет смысла, поэтому метод area() более правильно сделать абстрактным.

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

Слайд 35

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

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

Слайд 36

Любой подкласс, производный от абстрактного класса, должен реализовать все абстрактные методы из

Любой подкласс, производный от абстрактного класса, должен реализовать все абстрактные методы из
своего суперкласса или же сам быть объявлен абстрактным.

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

Слайд 37

У абстрактного класса не может быть объектов, но можно создать массив абстрактного

У абстрактного класса не может быть объектов, но можно создать массив абстрактного
класса, который будет содержать ссылки на объекты классов наследников:

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

Слайд 38

Результат выполнения программы:

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

Результат выполнения программы: Абстрактные классы Java

Слайд 39

Ключевое слово final означает завершенный и может быть использовано для объявления переменных,

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

Ключевое слово Java final

Слайд 40

Следующий пример показывает различные варианты объявления завершенных переменных.

Ключевое слово Java final

Следующий пример показывает различные варианты объявления завершенных переменных. Ключевое слово Java final

Слайд 41

Константы – это переменные, значение которых не меняется. Константами в Java принято

Константы – это переменные, значение которых не меняется. Константами в Java принято
называть public static final переменные класса. Имена констант следует задавать только заглавными буквами, а слова в имени разделять знаком подчеркивания: MAX_WEIGHT.
Константы часто используются для борьбы c магическими (или волшебными) числами, то есть непонятно что означающими числами или строками. Например, следующий код содержит несколько раз повторяющееся магическое число 9.81:

Ключевое слово Java final

Слайд 42

Давайте перепишем код введя константу с именем ACCELERATION. Какие преимущества дает нам

Давайте перепишем код введя константу с именем ACCELERATION. Какие преимущества дает нам
введение константы? Во-первых имя константы уже объясняет значение этого числа, и во-вторых при желании изменить значение ACCELERATION, это можно сделать в одном месте. После рефакторинга:

Ключевое слово Java final

Слайд 43

Чтобы запретить переопределение метода в классах наследниках, в начале его объявления следует

Чтобы запретить переопределение метода в классах наследниках, в начале его объявления следует
указать ключевое слово final. Такие методы еще называют завершенными.
Не имеет смысла объявлять метод private final так как private метод не виден в наследниках, соответственно не может быть переопределен.
Также конструктор не может быть объявлен как final.
Класс O содержит завершенный метод, который не может быть переопределен в классе наследнике P. При попытке возникнет ошибка компиляции:

Ключевое слово Java final

Слайд 44

Для предотвращения наследование класса в начале объявления класса следует указать ключевое слово

Для предотвращения наследование класса в начале объявления класса следует указать ключевое слово
final. Объявление класса завершенным неявно делает завершенными и все его методы. Одновременное объявление класса как abstract и final недопустимо.

Ключевое слово Java final

Слайд 45

Ключевое слово языка Java static используется для объявления статических членов класса -

Ключевое слово языка Java static используется для объявления статических членов класса -
методов и переменных. Также бывают статические блоки.
Разница между статическими данными и обычными членами класса состоит в том, что обращение к обычному члену класса должно осуществляться только в сочетании с объектом его класса. Когда же член класса объявлен с ключевым словом static, он доступен и без ссылки на какой-нибудь объект.

Статические переменные Java

Слайд 46

Статические переменные Java, объявляются внутри класса с ключевым словом static. Такие переменные,

Статические переменные Java, объявляются внутри класса с ключевым словом static. Такие переменные,
по существу, являются глобальными переменными. При объявлении объектов, копии статических переменных не создаются - создается одна статическая переменная на весь класс. Статическая переменная создается при загрузке класса.

Статические переменные Java

Слайд 47

Рассмотрим различие между обычными и статическими переменными на следующем примере. Для обращения

Рассмотрим различие между обычными и статическими переменными на следующем примере. Для обращения
к обычной переменной а, необходим объект класса StaticVars. К переменной b можно обращаться без упоминания объекта и даже без упоминания класса (если обращение происходит из того же класса):

Статические переменные Java

Слайд 48

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

При обращении к статической переменной из другого класса, необходимо указать имя ее
класса - StaticVars.b. Можно обратиться к статической переменной используя любой объект того же класса, например - staticVars1.b или staticVars2.b. Но такой вариант не рекомендуется, так как пользователь вашего кода может решить, что это обычная переменная.

Статические переменные Java

Слайд 49

Результат выполнения кода:

Статические переменные Java

Результат выполнения кода: Статические переменные Java

Слайд 50

Рассмотрим классический пример, демонстрирующий использование статических переменных для подсчета количества созданных объектов

Рассмотрим классический пример, демонстрирующий использование статических переменных для подсчета количества созданных объектов
класса Ball. Для этого определим в классе статическую переменную count, которая и будет содержать количество созданных объектов. При создании объекта всегда вызывается конструктор, поэтому именно там будем увеличивать переменную count. Для доступа к private переменной count определен метод getCount():

Статические переменные Java

Слайд 51

Результат выполнения кода:

Статические переменные Java

Результат выполнения кода: Статические переменные Java

Слайд 52

Статические методы можно вызывать не используя ссылку на объект. В этом их

Статические методы можно вызывать не используя ссылку на объект. В этом их
ключевое отличие от обычных методов класса. Для объявления таких методов используется ключевое слово static. На методы, объявленные как static, накладывается следующие ограничения:
Они могут непосредственно вызывать только другие статические методы.
Им непосредственно доступны только статические переменные.
Они не могут делать ссылки типа this или super.

Статические методы Java

Слайд 53

Пример использования статических методов.

Статические методы Java

Пример использования статических методов. Статические методы Java

Слайд 54

Статические методы Java

Статические методы Java

Слайд 55

Если для инициализации статических переменных требуется произвести вычисления, то для этой цели

Если для инициализации статических переменных требуется произвести вычисления, то для этой цели
достаточно объявить статический блок Java, который будет выполняться только один раз при первой загрузке класса. Объявляется статический блок с помощью ключевого слова static.

Статический блок Java

Слайд 56

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

Для того чтобы получить доступ к статическим членам классов, требуются указывать ссылку
на класс.
К примеру, для вызова статического метода cos() класса Math и обращения к ее статической переменной PI, необходимо указать имя класса Math.

Java static import

Слайд 57

Чтобы улучшить читабельность кода можно импортировать статические члены класса почти так же,

Чтобы улучшить читабельность кода можно импортировать статические члены класса почти так же,
как и обычные классы, и получить прямой доступ к статическим членам без указания имени класса. Для импорта используется оператор Java import static, после которого указывается полное имя класса и метод или переменная.
Статический импорт Java языка располагается после указания пакета перед объявлением класса.

Java static import

Слайд 58

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

В Java определен один специальный класс, называемый Object. Все остальные классы являются
подклассами, производными от этого класса, даже если в объявлении это явно не указано. В классе Object определен ряд методов, которые доступны всем классам языка Java.

Класс Object и методы класса Object

Слайд 59

Методы класса Object в Java:
protected Object clone() - создает новый объект, не

Методы класса Object в Java: protected Object clone() - создает новый объект,
отличающийся от клонируемого.
public boolean equals(Object obj) - определяет, равен ли один объект другому.
protected void finalize() - вызывается перед удалением неиспользуемого объекта.
public final Class getClass() - получает класс объекта во время выполнения.
public int hashCode() - возвращает хеш-код, связанный с вызывающим объектом.
public final void notify() - возобновляет исполнение потока, ожидающего вызывающего объекта.
public final void notifyAll() - возобновляет исполнение всех потоков, ожидающих вызывающего объекта.
public String toString() - возвращает символьную строку, описывающую объект.
public final void wait() - ожидает другого потока исполнения.
public final void wait(long timeout) - ожидает другого потока исполнения.
public final void wait(long timeout, int nanos) - ожидает другого потока исполнения.

Класс Object и методы класса Object

Слайд 60

В Java сравнение объектов производится с помощью метода equals() класса Object. Этот

В Java сравнение объектов производится с помощью метода equals() класса Object. Этот
метод сравнивает содержимое объектов и выводит значение типа boolean. Значение true - если содержимое эквивалентно, и false — если нет.
Операция == не рекомендуется для сравнения объектов в Java. Дело в том, что при сравнение объектов, операция == вернет true лишь в одном случае — когда ссылки указывают на один и тот же объект. В данном случае не учитывается содержимое переменных класса.
При создании пользовательского класса, принято переопределять метод equals() таким образом, что бы учитывались переменные объекта.

Класс Object и методы класса Object

Слайд 61

Рассмотрим пример использования метода equals() - в классе Person определены три переменные:

Рассмотрим пример использования метода equals() - в классе Person определены три переменные:
fullName, age и retired. В переопределенном методе equals() все они участвуют в проверке. Если вы не хотите учитывать какую-то переменную при проверке объектов на равенство, вы имеете право не проверять ее в методе equals().

Класс Object и методы класса Object

Слайд 62

Определим два объекта person1 и person2 типа Person с одинаковыми значениями. При

Определим два объекта person1 и person2 типа Person с одинаковыми значениями. При
их сравнении с помощью операции "==" вернется значение false, так как это разные объекты. Если же сравнивать их методом equals(), то результат будет равен true. Также в этом примере объявлена переменная person3, которой присвоена ссылка из переменной person1. Вот сравнение person1 == person3 вернет значение true, так как переменные указывают на один объект. При сравнении person1 и person3 с помощью метода equals(), тоже вернется значение true. В методе equals() первой строкой проверяются ссылки сравниваемых объектов - this == o, и если они равны, сразу же возвращается значение true.

Класс Object и методы класса Object

Слайд 63

Класс Object и методы класса Object

Класс Object и методы класса Object

Слайд 64

Результат выполнения:

Класс Object и методы класса Object

Результат выполнения: Класс Object и методы класса Object

Слайд 65

Часто необходимо узнать содержимое того или иного объекта. Для этого в классе

Часто необходимо узнать содержимое того или иного объекта. Для этого в классе
Object языка Java определен специальный метод toString(), возвращающий символьную строку описывающую объект. При создании нового класса принято переопределение toString() таким образом, чтобы возвращающая строка содержала в себе имя класса, имена и значения всех переменных.

Класс Object и методы класса Object

Слайд 66

Следующий пример демонстрирует это:

Класс Object и методы класса Object

Следующий пример демонстрирует это: Класс Object и методы класса Object

Слайд 67

Для вызова метода toString() необходимо просто передать нужный объект в System.out.println:

Класс Object

Для вызова метода toString() необходимо просто передать нужный объект в System.out.println: Класс
и методы класса Object

Слайд 68

Результат выполнения программы будет такой:
Чисто теоретически можно явно вызывать метод toString() -

Результат выполнения программы будет такой: Чисто теоретически можно явно вызывать метод toString()
System.out.println(person.toString()), но так не принято.
Если у класса Person не переопределен метод toString(), то при запуске класса PersonDemo4 вызовется метод toString(), определенный в классе Object. И на консоль выведется нечто такое:

Класс Object и методы класса Object

Слайд 69

Приложение на языке Java может вызывать методы, написанные на языке С++.
Такие методы

Приложение на языке Java может вызывать методы, написанные на языке С++. Такие
объявляются в языке Java с ключевым словом native, которое сообщает компилятору, что метод реализован в другом месте.
Например:
Методы, помеченные native, можно переопределять обычными методами в подклассах.

Класс Object и методы класса Object

Слайд 70

Интерфейс это конструкция языка Java, в рамках которой принято описывать абстрактные публичные

Интерфейс это конструкция языка Java, в рамках которой принято описывать абстрактные публичные
(abstract public) методы и статические константы (final static).
С помощью интерфейса можно указать, что именно должен выполнять класс его реализующий, но не как это делать. Способ реализации выбирает сам класс. Интерфейсы не способны сохранять данные состояния. Интерфейсы - это один из механизмов реализации принципа полиморфизма "один интерфейс, несколько методов".

Интерфейс

Слайд 71

Рассмотрим следующую картинку. У нас есть контракт (интерфейс), в котором описано какие

Рассмотрим следующую картинку. У нас есть контракт (интерфейс), в котором описано какие
действия должна выполнять мышка. Это например, клик по правой клавише и клик по левой. Разные производители мышки (классы), реализующие данный контракт (интерфейс), обязаны спроектировать мышки, у которых будут эти действия. Но как выглядят мышки, какие дополнительные опции будут иметь - все это решает сам производитель.

Интерфейс

Слайд 72

Интерфейсы как и классы могут быть объявлены c уровнем доступа public или

Интерфейсы как и классы могут быть объявлены c уровнем доступа public или
default.
Переменные интерфейса являются public static final по умолчанию и эти модификаторы необязательны при их объявлении. Например, в следующем примере объявлены переменные RIGHT, LEFT, UP, DOWN без каких-либо модификаторов. Но они будут public static final.

Интерфейс

Слайд 73

Все методы интерфейса являются public abstract и эти модификаторы тоже необязательны. Объявляемые

Все методы интерфейса являются public abstract и эти модификаторы тоже необязательны. Объявляемые
методы не содержат тел, их объявления завершаются точкой с запятой.

Интерфейс

Слайд 74

Чтобы указать, что данный класс реализует интерфейс, в строке объявления класса указываем

Чтобы указать, что данный класс реализует интерфейс, в строке объявления класса указываем
ключевое слово implements и имя интерфейса. Класс реализующий интерфейс должен содержать полный набор методов, определенных в этом интерфейсе. Но в каждом классе могут быть определены и свои методы. Например, следующий класс Transport реализует интерфейс Moveable. В нем реализованы методы moveRight() и moveLeft() интерфейса Moveable, и добавлены свои методы stop(), start().

Интерфейс

Слайд 75

Один интерфейс может быть реализован любым количеством классов. Например, в следующей схеме

Один интерфейс может быть реализован любым количеством классов. Например, в следующей схеме
добавлены еще два класса Robot и Device, которые тоже реализуют интерфейс Moveable.

Интерфейс

Слайд 76

Класс Robot из вышеуказанной схемы:

Интерфейс

Класс Robot из вышеуказанной схемы: Интерфейс

Слайд 77

Если класс реализует интерфейс, но не полностью реализует определенные в нем методы,

Если класс реализует интерфейс, но не полностью реализует определенные в нем методы,
он должен быть объявлен как abstract.
Например, класс Device реализует только один метод интерфейса Moveable, поэтому он абстрактный:

Интерфейс

Слайд 78

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

Тип интерфейса можно указывать при объявлении переменных, которые будут содержать ссылки на
объекты, классы которых реализуют этот интерфейс. Например, в следующем примере переменная moveable имеет тип Moveable, и указывает она на объект Transport. Но на основе интерфейсов нельзя порождать объекты. Например, в строке Moveable moveable1 = new Moveable() будет ошибка компиляции. При использовании переменной типа интерфейс, доступны только те члены класса, которые определены в этом интерфейсе. Например, нельзя вызвать метод start(), используя переменную moveable. А для переменной transport можно.

Интерфейс

Слайд 79

Один класс может реализовать любое количество интерфейсов. На следующей схеме показан класс

Один класс может реализовать любое количество интерфейсов. На следующей схеме показан класс
Pickup, который реализует два интерфейса CargoAuto и PassengersAuto:

Интерфейс

Слайд 80

Интерфейс

Интерфейс

Слайд 81

Для указания того, что класс реализует несколько интерфейсов, после ключевого слова implements

Для указания того, что класс реализует несколько интерфейсов, после ключевого слова implements
через запятую перечисляются нужные интерфейсы. Класс Pickup должен определить все методы реализуемых интерфейсов:

Интерфейс

Слайд 82

Интерфейсы объявленные в классах или в другие интерфейсах называются внутренние или вложенные.

Интерфейсы объявленные в классах или в другие интерфейсах называются внутренние или вложенные.
Например интерфейс NestedIf определен внутри класса A:

Интерфейс

Слайд 83

При обращении к интерфейсу NestedIf требуется указывать имя его внешнего класса -

При обращении к интерфейсу NestedIf требуется указывать имя его внешнего класса - A.NestedIf: Интерфейс
A.NestedIf:

Интерфейс

Слайд 84

Интерфейс

Интерфейс

Слайд 85

Интерфейс может наследоваться от другого интерфейса через ключевое слово extends. Один интерфейс,

Интерфейс может наследоваться от другого интерфейса через ключевое слово extends. Один интерфейс,
в отличие от классов, может расширять несколько интерфейсов.
Например, интерфейс Football расширяет интерфейсы TVProgram и Sport. Класс FootballImpl, реализующий интерфейс Football, должен переопределить методы всех трех интерфейсов Football, TVProgram и Sport:

Интерфейс

Слайд 87

Интерфейсы маркеры - это интерфейсы, у которых не определены ни методы, ни

Интерфейсы маркеры - это интерфейсы, у которых не определены ни методы, ни
переменные. Реализация этих интерфейсов придает классу определенные свойства. Например, интерфейсы Cloneable и Serializable, отвечающие за клонирование и сохранение объекта в информационном потоке, являются интерфейсами маркерами. Если класс реализует интерфейс Cloneable, это говорит о том, что объекты этого класса могут быть клонированы.

Интерфейс

Слайд 88

В JDК 8 в интерфейсы ввели методы по умолчанию - это методы,

В JDК 8 в интерфейсы ввели методы по умолчанию - это методы,
у которых есть реализация. Другое их название - методы расширения. Классы, реализующие интерфейсы, не обязаны переопределять такие методы, но могут если это необходимо. Методы по умолчанию определяются с ключевым словом default.

Интерфейс

Слайд 89

Интерфейс SomeInterface объявляет метод по умолчанию defaultMethod() с базовой реализацией:

Интерфейс

Интерфейс SomeInterface объявляет метод по умолчанию defaultMethod() с базовой реализацией: Интерфейс

Слайд 90

Класс SomeInterfaceImpl1, реализующий этот интерфейс, не переопределяет метод defaultMethod() - так можно.

Класс SomeInterfaceImpl1, реализующий этот интерфейс, не переопределяет метод defaultMethod() - так можно. Интерфейс

Интерфейс

Слайд 91

А если класс SomeInterfaceImpl2 не устраивает реализация по умолчанию, он переопределяет этот

А если класс SomeInterfaceImpl2 не устраивает реализация по умолчанию, он переопределяет этот метод: Интерфейс
метод:

Интерфейс

Слайд 92

Создаем два объекта классов SomeInterfaceImpl1 и SomeInterfaceImpl2, и вызываем для каждого метод

Создаем два объекта классов SomeInterfaceImpl1 и SomeInterfaceImpl2, и вызываем для каждого метод
defaultMethod(). Для объекта класса SomeInterfaceImpl1 вызовется метод, реализованный в интерфейсе, а для объекта класса SomeInterfaceImpl2 - его собственная реализация:

Интерфейс

Слайд 93

Результат выполнения:

Интерфейс

Результат выполнения: Интерфейс
Имя файла: ООП-в-.-Лекция-3.pptx
Количество просмотров: 53
Количество скачиваний: 0