Наследование, композиция, Abstract

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

В Java множественное наследование запрещено

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

Abstract

Если класс объявлен как абстрактный это значит нельзя создавать его экземпляры. Создать можно только экземпляр класса наследника. Некоторые методы могут быть абстрактными — т.е. методы без реализации

Абстрактный метод должен быть переопределен в классе наследнике.

Интерфейсы

Интерфейс служит для объявления контракта объекта по отношению к внешнему миру

Все методы в интерфейсах по умолчанию public и abstract — явно писать это не требуется

Поля public static final — константы

Могут быть в интерфейсе:

  • статические публичные методы,
  • default методы — методы с реализацией по умолчанию

default методы нужны для добавления новых методов — так как у программистов, использующих эту библиотеку нет обязанности переопределить метод

@FunctionalInterface — интерфейс с одним абстрактным методом, их реализацию можно записать в виде лямбда выражения или ссылки на метод

ИнтерфейсОписание
CharSequenceПоследовательность символов
length — длина
charAt — символ по индексу
subSequence — подпоследовательность
(String, StringBuilder)
AppendableКуда можно дописывать символы
(String)
Runnable@FunctionalInterface
Абстрактное нечто, которое можно запустить
run — запустить
Comparator<T>@FunctionalInterface
Умеет сравнивать пары объектов и сообщать какой из них больше
< — ‘-‘ возвращает отрицательное число
== — 0
> — ‘+’ положительное число
compare — сравнить

Композиция

Вложение одного экземпляра класса в другой

Override — переопределение метода

Факт успешного переопределения метода поможет подтвердить аннотация @Override

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

  • Метод базового класса должен быть виден в производном классе.
  • Тип, возвращаемый методом производного класса, должен совпадать или быть подклассом типа, возвращаемого методом базового класса
  • Метод производного класса должен иметь в точности тот же набор параметров, что и метод базового класса.
  • Метод производного класса должен иметь модификатор доступа, такой же или более открытый, чем метод базового класса.

supper

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

Так же можно использовать supper.foo() для вызова метода foo из базового класса.

Object

Все классы в java наследуются от класса Object

Основные методы класса Object

МетодОписание
toStringВыводит в стандартный поток вывода полное название класса и его шестнадцатеричный хэш код

java.lang.Object@3fe45
equalsСравнение объектов по содержимому

Реализация по умолчанию — сравнение ссылок

Требования на согласованность реализаций методов equals и hashCode

Если два объекта равны с точки зрения equals, то у них обязаны быть равны hash коды

hash не обязан возвращать адрес объекта

Хотя в javadoc к реализации метода hashCode указано, что метод hashCode возвращает адрес объекта — реализация JVM может переопределять эти данные. Адреса последовательно созданных объектов имели бы очень похожие хэш коды, если JVM не переопределяла метод hashCode

equals

Если в equals передать null, то должен вернуться false

null instanceof String вернет false
  • Проверить — указывают ли ссылки на один объект
if (this == anObject) {
    return true;
}
  • Проверить соответствие типа объекта по ссылке и выполнить сравнение
if (anObject instanceof String) {
    String other = (String) anObject;
    // ...
}

Проверка BigDecimal на instanceof Number вернет true

Так как подклассы тоже подходят под instanceof

hashCode

Целое число типа int

Оцените автора
Kosenkov.Pro
Добавить комментарий