
Перечислите методы класса
Objectequals()hashCode()toString()getClass()notify()notifyAll()wait()wait(long timeOut)wait(long timeOut, int nanos)
Зачем нужны методы
equals&hashCode?Используются для сравнения объектов.
Цель метода
equals– определить идентичны ли объекты внутри, сравнив внутреннее содержание объектов. Такequalsработает медленно, сначала сравниваются хэш коды объектов, и, в том случае, если хэш коды равны, идет проверка поequalsЧто будет, если переопределить equals, но не переопределить
hashCode?Изначально
hashCode— случайное число.Коллекции в Java перед тем как сравнить объекты с помощью
equalsвсегда ищут/сравнивают их с помощью методаhashCode(). И если у одинаковых объектов будут разныеhashCode, то объекты будут считаться разными — до сравнения с помощьюequalsпросто не дойдет.Зачем нужны методы
wait,notify,notifyAll?Иногда в программе может оказаться такая ситуация, что нить вошла в блок кода
synchronized, заблокировала монитор и не может работать дальше, т.к. каких-то данных еще не хватает: например, файл который она должна обработать еще не загрузился или что-нибудь в таком духе. Для решения этой проблемы и был придуман методwait(). Вызов этого метода приводит к тому, что нить освобождает монитор и «становится на паузу».Для снятия с паузы используются методы
notify,notifyAll. Методnotify«размораживает» одну случайную нить, методnotifyAll– все «замороженные» нити данного монитора.Как правильно клонировать объект?
Два типа клонирования.
Для клонирования объекта по умолчанию нужно:
- Добавить интерфейс
Cloneableсвоему классу - Переопределить метод
cloneи вызвать в нем базовую реализацию:
class Point implements Cloneable { int x; int y; public Object clone() { return super.clone(); } }Или можно написать реализацию метода
cloneсамому:class Point { int x; int y; public Object clone() { Point point = new Point(); point.x = this.x; point.y = this.y; return point; } }- Добавить интерфейс
Зачем нужен метод
finalize()и как он работает?Если ты помнишь, то
finalize()– это специальный метод, который вызывается у объекта перед тем, как сборщик мусора его уничтожит.Основная цель этого метода – освободить используемые внешние не-Java ресурсы: закрыть файлы, потоки ввода-вывода и т.п.
finalize()работает нестабильно.Этот метод не оправдывает возложенных на него надежд. Java-машина может отложить уничтожение объекта, как и вызов метода
finalizeна сколько угодно. Более того, она вообще не гарантирует, что этот метод будет вызван. В куче ситуаций ради «оптимизации» он не вызывается.В чем отличие
final,finally,finalize?final— модификатор- Поля не могут быть изменены, методы переопределены
- Классы нельзя наследовать
- Этот модификатор применяется только к классам, методам и переменным (также и к локальным переменным)
- Аргументы методов, обозначенные как
final, предназначены только для чтения, при попытке изменения будет ошибка компиляции - Переменные
finalне инициализируются по умолчанию, им необходимо явно присвоить значение при объявлении или в конструкторе, иначе – ошибка компиляции - Если final переменная содержит ссылку на объект, объект может быть изменен, но переменная всегда будет ссылаться на тот же самый объект
- Также это справедливо и для массивов, потому что массивы являются объектами, – массив может быть изменен, а переменная всегда будет ссылаться на тот же самый массив
- Если класс объявлен
finalиabstract(взаимоисключающие понятия), произойдет ошибка компиляции - Так как
finalкласс не может наследоваться, его методы никогда не могут быть переопределены
finally— блок в связкеtry-catch-finally, код в котором выполнится независимо от того вылетело ли исключение в блокеtryили нет. Используется для освобождения ресурсов.finalize— метод в классеObjectсм 6.Что такое
try-with-resources?Это специальная конструкция
try, называемаяtry-with-resources, в которой Обрати внимание – послеtryследуют круглые скобки, где объявляются переменные и создаются объекты. Эти объекты можно использовать внутри блокаtry, обозначенного скобками{}. Когда выполнение команд блокаtryзакончится, независимо от того – нормально оно закончилось или было исключение, для объекта, созданного внутри круглых скобок(), будет вызван методclose();Чем отличаются методы
wait(1000)иsleep(1000)?sleep()приостанавливает поток на указанное. состояние меняется на TIMED_WAITING, по истечению — RUNNABLEwait()меняет состояние потока на WAITINGможет быть вызвано только у объекта владеющего блокировкой, в противном случае выкинется исключение IllegalMonitorStateException. при срабатывании метода блокировка отпускается, что позволяет продолжить работу другим потокам ожидающим захватить ту же самую блокировку . в случае
wait(int)с аргументом состояние будет TIMED_WAITINGВ чем отличие
i++и++i?++i,iсначала увеличивается на 1, затем участвует в выражении.i++,iсначала участвует в выражении, затем увеличивается на 1.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Что будет, если переопределить equals, но не переопределить hashCode?Будет нарушение контракта междуequals()иhashCode(), который гласит что: Если два объекта равны друг другу, то естьequals(Object)возвращаетtrue, то вызовhashCode()у каждого из них должен возвращать одинаковые целые числа.wait может быть «разбужен» другим потоком с использованием notify, sleep не может. Так же wait (иnotify) должны в быть synchronized блоке.
Object obj = ...;
synchronized (obj) {
obj.wait();
}
Пока текущий (выполняющийся) поток — ожидает waits и releases, другой поток может сделать
synchronized (obj) { obj.notify(); }
(на том же obj) и первый поток проснётся. Можно так же вызвать notifyAll, если более одного потока ожидают — это разбудит их всех. Тем не менее, только один из потоков сможет захватить монитор (т.к. wait в synchronized блоке).
Ещё одно различие в том, что wait вызывается на Object, в то время как sleep вызывается на Thread.
Если суммировать, то используйте sleep() для time-syncronization и wait() для multi-thread-synchronization.
В качестве вводного предложения к ответу можно добавить, что
"… Если цель переопределить equals, то одинаково важно соблюсти и сигнатуру, и корректность условий сравнений объектов внутри метода, и правильность работы класса в целом, поскольку equals является частью определенной системы."
взято отсюда
Дополнение: Объект в круглых скобках должен реализовывать (implements) интерфейс AutoCloseable или его потомков.
В общем, по вопросу номер 1, можно для подсказки глянуть вот
Так вот не всегда. Ответ в строчке «System.exit(0);» в try блоке.
По методам, останавливающим JVM в try блоке, например также
В дополнительных материалах Философия джава — Приложение А: Передача и возврат объектов рекомендуется так:
Если будут ещё отработанные заметки выкладывайте, будем прорабатывать :)
Я бы ещё добавил два защищенных метода:
protected native Object clone()
protected void finalize()