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

Сравнение интерфейсов, абстрактных и обычных классов

Лекция 4

Возможность

Интерфейс

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

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

Интерфейсов

Интерфейсов

 

 

Абстрактных классов

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

Интерфейсов

Интерфейсов

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

Нет

Да

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

Нет

Да

Свойства (поля)

Нет

Да

Константы (static final)

Да

Да

«Обычные» методы

Нет

Да

Абстрактные методы

Нет

Да

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

Да (Java8)

Да

Методы «по умолчанию»

Да (Java8)

Да (обычные)

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

Да

Да

Переопределение (сокрытие) методов

Нет

Да

Вложенный класс

Нет

Да

Может быть создан как объект

Нет

Нет

Может быть переменной (ссылкой)

Да

Нет

Хранение состояния (данных)

Нет

Нет

Обычный класс

Интерфейсов Абстрактных классов Обычных классов

Интерфейсов

Да

Да

Да

Да

Да

Нет

Да Да (обычные) Да Да Да Да Да Да

Интерфейсы в Java

Лекция 4

Интерфейсы один из основных инструментов реализации полиморфизма в Java.

До Java8 методы интерфейса не могли иметь «тела» т.е. все методы интерфейса были абстрактными. В Java8 появилась возможность определять два вида методов с «телом»:

1.методы «по умолчанию» с помощью ключевого слова default

2.статические методы с помощью ключевого слова static

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

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

Пример интерфейса в Java

Лекция 4

package study.interfaces; import java.time.LocalDate; public interface human {

/**

*Установить имя автора

*@return boolean. Если false - смотреть содержимое err

*@param initValue

*/

boolean setName(String initValue);

/**

*Установить дату рождения

*@return boolean

*@param initValue

*/

boolean setDateBirth(LocalDate initValue);

//Другие объявления методов интерфейса human

//Пример определения метода по умолчанию checkData

//Данная реализация checkData вызывается, если она не определена в наследниках /**

*Проверить все данные на корректность

*@return true, если все данные корректны

*/

default boolean checkData() { boolean Result = true;

//Код проверки значений свойств: Name, Annot и т. д. c записью true или false в Result return Result;

}

//Пример статического метода checkDateBirth. Метод checkDateBirth может быть вызван без создания объекта //например, вот так: human.checkDateBirth(agrument)

/**

*Проверка корректности даты рождения

*@param initValue - дата, типа LocalDate

*@return true, если дата - корректна

*/

static boolean checkDateBirth(LocalDate initValue) { boolean Result = true;

//Код проверки значения даты рождения.

//Например, что переданная дата не превосходит текущую return Result;

}

}

Пример интерфейса в Java

Лекция 4

Интерфейс author на базе которого будет создан абстрактный класс author

package study.interfaces;

import java.util.Map;

public interface author extends human {

/**

*Извлечь все поля (свойства) автора

*@return Map <Integer, String>

*/

Map <String, String> getAuthor();

/**

*Извлечь количество публикаций

*@return Int

*/

int getNumberPublication();

/**

*Установить количество публикаций

*@return

*/

boolean setNumberPublication();

/**

*Устанавливаем все поля/свойства автора

*@param dataInit

*/

boolean setAuthor(Map <String, String> dataInit);

}

Пример абстрактоного класса в Java

Лекция 4

Абстрактный класс author (фрагмент). Определение конструктовов

package study.abstracts;

import java.time.LocalDate; import java.util.Hashtable; import java.util.Map; import study.validator;

public abstract class author implements study.interfaces.author {

//------------------- конструкторы ---------------

/** * Инициализация объекта с данными по умолчанию */

protected author() {

this.Name = this.Annot = this.Land = ""; this.WorkPlace = this.NumberPublication = 0; this.DateBirth = null;

}

/**

*Инициализация объекта с начальными данными

*@param initValue

*/

protected author (Map <String, String> initValue ) { if( !validator.isNullEmpty(initValue) ) {

setAuthor(initValue);

}

}

//Дальнейший код класса

Пример абстрактоного класса в Java

Лекция 4

Абстрактный класс author (фрагмент). Определение свойств (полей)

//Предыдущий код класса

//--------------------

поля (свойства) ----------------

/** * Имя автора */

private String Name; /**

* Аннотация (описание) автора */

private String Annot; /**

* Название языка материала */

private String Land; /**

* Организация в которой работает автор */

private int WorkPlace; /** * Дата рождения автора */

private LocalDate DateBirth; /** * Количество публикаций */

private int NumberPublication;

//Дальнейший код класса

Пример абстрактоного класса в Java

Лекция 4

Абстрактный класс author (фрагмент). Объявление и определение методов

//Предыдущий код класса

//Возвращает имя автора public String getName() { return Name;

}

//Возвращаем код организации, в которой работает автор abstract public int getWorkPlace();

//Промежуточный код класса

/**

*Устанавливаем все поля/свойства автора

*@param dataInit

*/

public boolean setAuthor(Map <String, String> dataInit) { return setAllset(dataInit);

}

/**

*Устанавливаем все поля/свойства устанавливаемые через get

*@param dataInit

*/

public boolean setAllset(Map <String, String> dataInit)

{

boolean Result = false;

if( !validator.isNullEmpty(dataInit) ) {

if(!this.setName(dataInit.get("Name")) )

Result = false; if(!this.setAnnot(dataInit.get("Annot")))

Result = false; if(!this.setLand(dataInit.get("Land")))

Result = false; if(!this.setWorkPlace(Integer.parseInt(dataInit.get("WorkPlace"))))

Result = false; if(!this.setDateBirth(LocalDate.parse(dataInit.get("DateBirth"))))

Result = false;

if( !this.setNumberPublication(Integer.parseInt( dataInit.get("NumberPublication"))) )

Result = false;

}

return Result;

}

//Дальнейший код класса

Модификаторы доступа в Java

Лекция 4

Модификаторы доступат реализуют инкапсуляцию

Таблица области действия модификаторов доступа

Видимость с учетом модулей

 

 

В пакетах модулей, которым

 

 

Свой модуль. Все пакеты.

экпортирован пакет

Прочие модули

 

 

 

 

public

Доступ есть

Доступ есть

Доступа нет

 

 

 

 

//hello.java/src/module-info.java

//from.miet/src/module-info.java

module hello.java {

module from.miet {

//Требуем пакеты из модуля from.miet

//Объявляем пакет info экспортируемым для любого модуля

requires from.miet;

exports info;

}

//exports info to hello.java; - экспорт только для hello.java

 

}

Использование ключевого слова this

Лекция 4

С помощью this можно обратиться к методу или свойству (полю) текущего объекта

This позволяет разрешать ситуации совпадения имен локальных переменных и переменных свойств класса

//Предыдущий код класса

//Устанавливает имя автора

public void setName(String Name) { this.Name = Name;

}

//Последующий код класса

Методы в Java

Лекция 4

Допустимые модификации методов:

1.Наследование

2.Перегрузка

3.Переопределение

4.Обращение к методу суперкласса (кл. слово super)

//Код суперкласса

//Устанавливает автора

public void setAuthor(String Name) { this.Name = Name;

}

//Перегрузка — изменение типа и/или числа аргументов public void setAuthor(String Name, int Age) {

this.Name = Name; this.Age = Age;

}

//Код класса наследника

//Переопределение — послное совпадение по имени и аргументам public void setAuthor(String Name) {

super.setName(Name); //Можно вызвать метод суперкласса this.Age = 0;

}

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