В классе наследнике можно добавлять поля и методы, тем самым расширяя возможности базового класса
В 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