Часть 3 Flashcards
- Как связан любой пользовательский класс с классом Object
Все классы являются наследниками суперкласса Object. Это не нужно указывать явно. В результате объект Object может ссылаться на объект любого другого класса.
- Расскажите про каждый из методов класса Object
- public final native Class getClass()—возвращает в рантайме класс данного объекта.
- public native int hashCode()— возвращает хеш-код
- public boolean equals(Object obj)— сравнивает объекты.
- protected native Object clone() throws CloneNotSupportedException— клонирование объекта
- public String toString()— возвращает строковое представление объекта.
- public final native void notify()—просыпается один поток, который ждет на “мониторе” данного объекта.
- public final native void notifyAll()— просыпаются все потоки, которые ждут на “мониторе” данного объекта.
- public final native void wait(long timeout) throws InterruptedException— поток переходит в режим ожидания в течение указанного времени.
- public final void wait() throws InterruptedException—приводит данный поток в ожидание, пока другой поток не вызоветnotify()илиnotifyAll()методы для этого объекта.
- public final void wait(long timeout, int nanos) throws InterruptedException—приводит данный поток в ожидание, пока другой поток не вызоветnotify()илиnotifyAll()для этого метода, или пока не истечет указанный промежуток времени.
- protected void finalize() throws Throwable— вызывается сборщиком мусора, когда garbage collector определил, что ссылок на объект больше нет.
- Что такое метод equals(). Чем он отличается от операции ==
== - сравнивает по ссылкам
equals() - сравнивает по состоянию объектов
- Что будет, если переопределить equals не переопределяя hashCode Какие могут возникнуть проблемы
Нарушится контракт. Классы и методы, которые использовали правила этого контракта могут некорректно работать. Так для объектаHashMapэто может привести к тому, что пара, которая была помещена в Mapвозможно не будет найдена в ней при обращении к Map, если используется новый экземпляр ключа.
- Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode
Те, которые используют при определении методаequals()
. Хэш код должен быть равномерно распределен на области возможных принимаемых значений.
- Что такое volatile и transient Для чего и в каких случаях можно было бы использовать default
volatile — не используется кэш (имеется ввиду область памяти в которой JVM может сохранять локальную копию переменной, чтобы уменьшить время обращения к переменной) при обращении к полю. Для volatile переменной JVM гарантирует синхронизацию для операций чтения/записи, но не гарантирует для операций изменения значения переменной.
у каждого потока есть CPU кэш который копирует
данные которые в главной памяти.
Проблем бы не было если в компьютере не больше 1 CPU.
Но у современных компьютеров их конечно много.
представь что есть счётчик и два потока
поток1 читает и записывает
поток2 только читает
поток не может быть преравн при чтении или записи
так как это атомик операция
но
если поток1 работает на CPU1
а поток2 на CPU2
что случится
0)Значение счётчика в главной памяти - 0
1)поток1 считывает от туда 0
2)поток1 прибавляет к счётчику 1
3)поток1 записывает значение в cpu кэш
4)поток2 считывает значение счётчика из главной памяти,
поскольку в кеше её нет
и получает старое значение 0
ключевое слово volatile
делает так что после записи в CPU
значение сразу записывается в главную память
НО
счётчик++ делает 2 действия
с начала считывает
а потом записывает увеличенное и копирует в главную память.
transient— указание того, что при сериализации/десериализации данное поле не нужно сериализовать/десериализовывать.
- Расширение модификаторов при наследовании, переопределении и сокрытии методов. Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость А если protecte А сузить видимость
Действует общий принцип: расширять видимость можно, сужать нельзя.privateметоды видны только внутри класса, для потомков они не видны. Поэтому их и расширить нельзя.
- Имеет ли смысл объявлять метод private final
Нет, такой методи такне виден для наследников, а значит не может быть ими переопределен.
- Какие особенности инициализации final переменных
- Для поля. Поле помеченное при помощи словаfinalне может изменить свое значение после инициализации.
Не статическое final поле можно инициализировать: при описании, в конструкторе (во всех), в статическом блоке, в динамическом блоке.
Статическое final поле (static final) инициализируется либо в статическом блоке, либо при описании. - Значение локальных переменных, а так же параметров метода помеченных при помощи словаfinalне могут быть изменены после присвоения.
- Что будет, если единственный конструктор класса объявлен как final
К конструктору не применимо ключевое словоfinal.