- •Основы Java
- •Концепция ООП
- •Концепция ООП
- •Концепция ООП
- •Концепция ООП. Принципы
- •Классы в Java
- •Сравнение интерфейсов, абстрактных и обычных классов
- •Интерфейсы в Java
- •Пример интерфейса в Java
- •Пример интерфейса в Java
- •Пример абстрактоного класса в Java
- •Пример абстрактоного класса в Java
- •Пример абстрактоного класса в Java
- •Модификаторы доступа в Java
- •Использование ключевого слова this
- •Методы в Java
- •Конструкторы в Java
- •Использование ключевого слова static
- •Использование ключевого слова final
- •Использование метода finalize()
- •Внутренние и вложенные классы в Java
- •Динамическая диспетчеризация в Java
- •Рекомендации по разработке классов
Сравнение интерфейсов, абстрактных и обычных классов |
Лекция 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;
}