5. ООП. Наследование. Классы Object и Enum Flashcards
Что такое наследование?
Наследование - одно из базовых понятий ООП, согласно которому некоторый
класс может получить данные и функциональность, то есть поля и методы,
другого класса, тем самым способствуя переиспользованию кода.
Какие есть ограничения при наследовании классов?
Java не поддерживает множественное
наследование и нельзя наследоваться от класса помеченного как “final”
Что такое переопределение метода?
Переопределение метода (англ. Method overriding) в объектно-ориентированном программировании — одна из возможностей языка программирования, позволяющая подклассу или дочернему классу обеспечивать специфическую реализацию метода, уже реализованного в одном из суперклассов или родительских классов
Как мы можем менять модификаторы доступа при переопределении методов?
в сторону расширения области видимости
От какого класса неявно наследуются все классы?
От класса Object
Перечислите методы в классе Object?
Object clone() - создаёт новый объект, не отличающийся от клонируемого (Существует глубокое и поверхностное клонирование)
Поверхностное копирование копирует настолько малую часть информации, насколько это возможно. По умолчанию, клонирование в Java является поверхностным, т.е. Object class не знает о структуре класса, которого он копирует. При клонировании, JVM делает такие вещи:
Если класс имеет только члены примитивных типов, то будет создана совершенно новая копия объекта и возвращена ссылка на этот объект.
Если класс содержит не только члены примитивных типов, а и любого другого типа класса, тогда копируются ссылки на объекты этих классов. Следовательно, оба объекта будут иметь одинаковые ссылки.
Глубокое копирование дублирует все. Глубокое копирование — это две коллекции, в одну из которых дублируются все элементы оригинальной коллекции. Мы хотим сделать копию, при которой внесение изменений в любой элемент копии не затронет оригинальную коллекцию.
Глубокое клонирование требует выполнения следующих правил:
Нет необходимости копировать отдельно примитивные данные;
Все классы-члены в оригинальном классе должны поддерживать клонирование. Для каждого члена класса должен вызываться super.clone() при переопределении метода clone();
Если какой-либо член класса не поддерживает клонирование, то в методе клонирования необходимо создать новый экземпляр этого класса и скопировать каждый его член со всеми атрибутами в новый объект класса, по одному.
boolean equals(Object obj) - определяет, равен ли один объект другому void finalize() - вызывается перед удалением неиспользуемого объекта Class> getClass() - получает класс объекта во время выполнения int hashCode() - возвращает хеш-код, связанный с вызывающим объектом void notify() - возобновляет выполнение потока, который ожидает вызывающего объекта void notifyAll() - возобновляет выполнение всех потоков, которые ожидают вызывающего объекта String toString() - возвращает строку, описывающую объект void wait() - ожидает другого потока выполнения void wait(long millis) - ожидает другого потока выполнения void wait(long millis, int nanos) - ожидает другого потока выполнения Методы getClass(), notify(), notifyAll(), wait() являются финальными и их нельзя переопределять.
Для чего нужен метод finalize?
Метод, который вызывается сборщиком мусора перед тем, как объект будет уничтожен. Можно переопределить метод, чтобы выполнялись нужные действия перед уничтожением.
Что необходимо сделать чтобы класс имел возможность клонирования?
Для того, чтобы использовать метод clone нужно:
- Имплементировать интерфейс Cloneable, иначе будет выброшено исключение.
- Переопределить метод clone(), заменив модификатор доступа protected на public.
Какой контракт между методами equals и hashCode?
Переопределяя в своем коде метод equals, необходимо всегда переопределять и метод hashCode.
Так как фактически два экземпляра класса отличаются, потому что находятся в разных областях памяти, сравнивать их приходится по некоторым логическим признакам. Соответственно, два логически эквивалентных объекта, должны возвращать одинаковое значение хэш-функции.
Если объекты равны, то и хэш коды равны, но не наоборот
От какого класса неявно наследуются все перечисления?
от класса Enum
Какие ограничения вы знаете у enum?
Можно:
- объявлять статические/нестатические поля и методы
- объявлять конструкторы
- имплементировать интерфейсы
Нельзя:
- наследоваться от класса Enum и созданного перечисления
- создавать НЕприватные конструкторы
- наследовать классы от наших enum’ов
Что такое нисходящие и восходящее преобразование ссылочных типов?
Восходящее преобразование (от подкласса внизу к суперклассу вверху иерархии) или upcasting. Такое преобразование осуществляется автоматически. А наоборот это нисходящее преобразование и автоматически не выполняется. В этом случае нам надо использовать операцию преобразования типов.
Для чего служит ключевое слово instanceof?
Оператор instanceof, проверяет является ли класс объекта левого операнда классом или подклассом
правого операнда, возвращает true или false. Это нужно для того чтобы не было ошибок от преобразования ссылочных типов