Главная страница

ОглавлениеCore


Скачать 1.53 Mb.
НазваниеОглавлениеCore
Дата17.05.2023
Размер1.53 Mb.
Формат файлаpdf
Имя файлаpolnaya_metodichka (1).pdf
ТипДокументы
#1138113
страница9 из 25
1   ...   5   6   7   8   9   10   11   12   ...   25
Каков порядок вызова конструкторов инициализации с учетом иерархии
классов?
Сначала вызываются все статические блоки в очередности от первого статического блока корневого предка и выше по цепочке иерархии до статических блоков самого класса.
Затем вызываются нестатические блоки инициализации корневого предка, конструктор корневого предка и так далее вплоть до нестатических блоков и конструктора самого класса.
При создании объекта производного класса конструкторы вызываются в порядке вниз по
иерархии наследования классов, т. е. начиная с самого базового класса и заканчивая производным классом.
Зачем нужны и какие бывают блоки инициализации?
Блоки инициализации представляют собой код, заключенный в фигурные скобки и размещаемый внутри класса вне объявления методов или конструкторов.
Существуют статические и нестатические блоки инициализации.
Блок инициализации выполняется перед инициализацией класса загрузчиком классов или созданием объекта класса с помощью конструктора.
Несколько блоков инициализации выполняются в порядке следования в коде класса.
Блок инициализации способен генерировать исключения, если их объявления перечислены в throws всех конструкторов класса.
Блок инициализации возможно создать и в анонимном классе.
Используются для выполнения кода, который должен выполняться один раз при
инициализации класса.

Для чего используются статические блоки инициализации?
Статические блоки инициализация используются для выполнения кода, который должен
выполняться один раз при инициализации класса загрузчиком классов в момент,
предшествующий созданию объектов этого класса при помощи конструктора. Такой блок принадлежит только самому классу.
Где разрешена инициализация статических/нестатических полей?
Статические поля можно инициализировать при объявлении, в статическом или нестатическом блоке инициализации.
Нестатические поля можно инициализировать при объявлении, в нестатическом блоке инициализации или в конструкторе.
Что произойдет, если в блоке инициализации возникнет исключительная
ситуация?
Для нестатических блоков инициализации, если выбрасывание исключения прописано явным образом, требуется, чтобы объявления этих исключений были перечислены в throws всех конструкторов класса (в контракте конструктора). Иначе будет ошибка компиляции.
В остальных случаях взаимодействие с исключениями будет проходить так же, как и в любом другом месте. Класс не будет инициализирован, если ошибка происходит в статическом блоке, и объект класса не будет создан, если ошибка возникает в нестатическом блоке.
Для статического блока выбрасывание исключения в явном виде приводит к ошибке компиляции ExceptionInizialazionError.
Какое исключение выбрасывается при возникновении ошибки в блоке
инициализации класса?
Если возникшее исключение – наследник Error:

для
статических блоков инициализации будет выброшено
java.lang.ExceptionInInitializerError;

для нестатических будет проброшено исключение-источник.
Если возникшее исключение – наследник Error, то в обоих случаях будет выброшено
java.lang.Error.
Если исключение java.lang.ThreadDeath (смерть потока), то в этом случае никакое исключение выброшено не будет.
Что такое класс Object?
Все классы являются наследниками суперкласса Object. Это не нужно указывать явно. В
результате объект Object может ссылаться на объект любого другого класса.
Какие методы есть у класса Object (перечислить все)? Что они делают?
Object – это базовый класс для всех остальных объектов в Java. Любой класс наследуется от
Object и, соответственно, наследуют его методы:

public boolean equals(Object obj) – служит для сравнения объектов по значению;

int hashCode() – возвращает hash-код для объекта;


String toString() – возвращает строковое представление объекта;

Class getClass() – возвращает класс объекта во время выполнения;

protected Object clone()создает и возвращает копию объекта;

void notify() – возобновляет поток, ожидающий монитор;

void notifyAll() – возобновляет все потоки, ожидающие монитор;

void wait() – остановка вызвавшего метод потока до момента, пока другой поток не вызовет метод notify() или notifyAll() для этого объекта;

void wait(long timeout) – остановка вызвавшего метод потока на определенное время или пока другой поток не вызовет метод notify() или notifyAll() для этого объекта;

void wait(long timeout, int nanos) – остановка вызвавшего метод потока на определенное время или пока другой поток не вызовет метод notify() или notifyAll()
для этого объекта;

protected void finalize() – может вызываться сборщиком мусора в момент удаления объекта при сборке мусора.
Расскажите про equals и hashcode
Хеш-код –это целочисленный результат работы метода, которому в качестве входного параметра передан объект. Рассчитывается по нативному методу.
Equals – это метод, определенный в Object, который служит для сравнения объектов. При
сравнении объектов при помощи == идет сравнение по ссылкам. При сравнении по
equals() идет сравнение по состояниям объектов (по умолчанию случайным образом, но есть другие варианты).
По умолчанию ссылки, чтобы его использовать, нужно переопределить (на область в памяти), т. к. при == сравниваются ссылки, а equals сравнивает состояния:
Свойства equals():

Рефлексивность: для любой ссылки на значение x, x.equals(x) вернет true;

Симметричность: для любых ссылок на значения x и y, x.equals(y) должно вернуть true, тогда и только тогда, когда y.equals(x) возвращает true.

Транзитивность: для любых ссылок на значения x, y и z, если x.equals(y) и y.equals(z) возвращают true, тогда и x.equals(z) вернет true;

Непротиворечивость: для любых ссылок на значения х и у, если несколько раз вызвать х.equals(y), постоянно будет возвращаться значение true либо постоянно будет возвращаться значение false при условии, что никакая информация,
используемая при сравнении объектов, не поменялась;

Совместимость с hashCode(): два тождественно равных объекта должны иметь одно и то же значение hashCode().
При переопределении equals() обязательно нужно переопределить метод hashCode().
Равные объекты должны возвращать одинаковые хэш коды.

Каким образом реализованы методы hashCode() и equals() в классе Object?
1. Реализация метода Object.equals() сводится к проверке на равенство двух ссылок:
public boolean equals(Object obj) {
return (this == obj);
}
2. Реализация метода Object.hashCode() описана как native, т. е. определенной не с помощью Java-кода и обычно возвращает адрес объекта в памяти:
public native int hashCode();
Зачем нужен equals(). Чем он отличается от операции ==?
Метод equals() определяет отношение эквивалентности объектов.
При сравнение объектов с помощью == сравнение происходит лишь между ссылками.
При сравнении по переопределенному разработчиком equals() – по внутреннему состоянию объектов.
Правила переопределения метода Object.equals()

Использование оператора == для проверки, является ли аргумент ссылкой на указанный объект. Если является, возвращается true. Если сравниваемый объект
== null, должно вернуться false.

Использование оператора instanceof и вызова метода getClass() для проверки,
имеет ли аргумент правильный тип. Если не имеет, возвращается false.

Приведение аргумента к правильному типу. Поскольку эта операция следует за проверкой instanceof она гарантированно будет выполнена.

Обход всех значимых полей класса и проверка того, что значение поля в текущем объекте и значение того же поля в проверяемом на эквивалентность аргументе соответствуют друг другу. Если проверки для всех полей прошли успешно,
возвращается результат true, в противном случае – false.

По окончанию переопределения метода equals() следует проверить: является ли порождаемое отношение эквивалентности рефлексивным, симметричным,
транзитивным и непротиворечивым? Если ответ отрицательный, метод подлежит соответствующей правке.
Что будет, если переопределить equals(), не переопределяя hashCode()?
Какие могут возникнуть проблемы?
Классы и методы, которые используют правила этого контракта, могут работать некорректно.
Так для HashMap это может привести к тому, что пара «ключ-значение», которая была в нее помещена, при использовании нового экземпляра ключа не будет в ней найдена.
Какой контракт между hashCode() и equals()?
1. Если два объекта возвращают разные значения hashcode(), то они не могут быть равны.
2. Если equals объектов true, то и хеш-коды должны быть равны.

3. Переопределив equals, всегда переопределять и hashcode.
Для чего нужен метод hashCode()?
Метод hashCode() необходим для вычисления хеш-кода переданного в качестве входного параметра объекта. В Java это целое число, в более широком смысле – битовая строка фиксированной длины, полученная из массива произвольной длины. Этот метод реализован таким образом, что для одного и того же входного объекта хеш-код всегда будет одинаковым.
Следует понимать, что в Java множество возможных хеш-кодов ограничено типом int, а множество объектов ничем не ограничено. Из-за этого вполне возможна ситуация, что хеш- коды разных объектов могут совпасть:

если хеш-коды разные, то и объекты гарантированно разные;

если хеш-коды равны, то объекты могут не обязательно равны.
В случае, если hashCode() не переопределен, то будет выполнятся его реализация по умолчанию из класса Object: для разных объектов будет разный хеш-код.
Значение int может быть в диапазоне 2 32
, при переопределении хеш-кода можно использовать отрицательное значение.
Правила переопределения метода hashcode()
1. Если хеш-коды разные, то и входные объекты гарантированно разные.
2. Если хеш-коды равны, то входные объекты не всегда равны.
3. При вычислении хеш-кода следует использовать те же поля, которые сравниваются в equals и которые не вычисляются на основе других значений.
Есть ли какие-либо рекомендации о том, какие поля следует использовать
при подсчете hashCode()?
Следует выбирать поля, которые с большой долью вероятности будут различаться. Для этого необходимо использовать уникальные, лучше всего примитивные поля, например такие как id, uuid. При этом нужно следовать правилу: если поля задействованы при вычислении hashCode(), то они должны быть задействованы и при выполнении equals().
Могут ли у разных объектов быть одинаковые hashCode()?
Да, могут. Метод hashCode() не гарантирует уникальность возвращаемого значения.
Ситуация, когда у разных объектов одинаковые хеш-коды называется коллизией.
Вероятность возникновения коллизии зависит от используемого алгоритма генерации хеш- кода.
Почему нельзя реализовать hashcode(), который будет гарантированно
уникальным для каждого объекта?
В Java множество возможных хеш-кодов ограничено типом int, а множество объектов ничем не ограничено.
Из-за этого вполне возможна ситуация, что хеш-коды разных объектов могут совпасть.

Почему хеш-код в виде 31 * x + y предпочтительнее чем x + y?

множитель создает зависимость значения хеш-кода от очередности обработки полей, что в итоге порождает лучшую хеш-функцию;

31 можно легко сдвигать побитово;

в хеш-коде должны фигурировать поля, которые фигурируют в equals().
Чем a.getClass().equals(A.class) отличается от a instanceOf A.class?
getClass() получает только класс, а оператор instanceof проверяет, является ли объект экземпляром класса или его потомком.
instanceof
Оператор instanceof сравнивает объект и указанный тип. Его можно использовать для проверки, является ли данный объект экземпляром некоторого класса, либо экземпляром его дочернего класса, либо экземпляром класса, который реализует указанный интерфейс.
this.getClass() == that.getClass() проверяет два класса на идентичность, поэтому для корректной реализации контракта метода equals() необходимо использовать точное сравнение с помощью метода getClass().
Что такое исключение?
Исключение – это ошибка (является объектом), возникающая во время выполнения программы.
Опишите иерархию исключений
Исключения делятся на несколько классов, но все они имеют общего предка – класс
Throwable, потомками которого являются классы Exception и Error.
Ошибки (Errors) представляют собой более серьезные проблемы, которые, согласно спецификации Java, не следует обрабатывать в собственной программе, поскольку они связаны с проблемами уровня JVM. Например, исключения такого рода возникают, если закончилась память, доступная виртуальной машине.
Исключения (Exceptions) являются результатом проблем в программе, которые в принципе решаемы, предсказуемы и последствия которых возможно устранить внутри программы.
Например, произошло деление целого числа на ноль.

Расскажите про обрабатываемые и необрабатываемые исключения
В Java все исключения делятся на два типа:

checked (контролируемые/проверяемые исключения) должны обрабатываться блоком catch или описываться в сигнатуре метода (например throws IOException),
наличие такого обработчика/модификатора сигнатуры проверяются на этапе компиляции;

unchecked (неконтролируемые/непроверяемые исключения), к которым относятся ошибки Error (например OutOfMemoryError), обрабатывать которые не рекомендуется и исключения времени выполнения, представленные классом
RuntimeException и его наследниками (например NullPointerException), которые могут не обрабатываться блоком catch и не быть описанными в сигнатуре метода.
Можно ли обработать необрабатываемые исключения?
Можно, чтобы в некоторых случаях программа не прекратила работу. Отлавливаются в try- catch.
Какой оператор позволяет принудительно выбросить исключение?
Это оператор throw:
throw new Exception();
О чем говорит ключевое слово throws?
Модификатор throws прописывается в сигнатуре метода и указывает на то, что метод потенциально может выбросить исключение с указанным типом.
Передает обработку исключения вышестоящему методу. Используется в конструкторе,
методе, классе.
Как написать собственное («пользовательское») исключение?
Необходимо унаследоваться от базового класса требуемого типа исключений (например, от
Exception или RuntimeException)
и переопределить методы.
Какие существуют unchecked exception?
Наиболее часто встречающиеся:
ArithmeticException,
ClassCastException,
ConcurrentModificationException,
IllegalArgumentException,
IllegalStateException,
IndexOutOfBoundsException,
NoSuchElementException,
NullPointerException,
UnsupportedOperationException.
Что представляет из себя ошибки класса Error?
Ошибки класса Error представляют собой наиболее серьезные проблемы уровня JVM.
Например, исключения такого рода возникают, если закончилась память, доступная виртуальной машине. Обрабатывать такие ошибки не запрещается, но делать этого не рекомендуется.

Что вы знаете о OutOfMemoryError?
OutOfMemoryError выбрасывается, когда виртуальная машина Java не может создать
(разместить) объект из-за нехватки памяти, а сборщик мусора не может высвободить достаточное ее количество.
Область памяти, занимаемая java-процессом, состоит из нескольких частей. Тип
OutOfMemoryError зависит от того, в какой из них не хватило места:

java.lang.OutOfMemoryError: Java heap space: не хватает места в куче, а именно, в области памяти, в которую помещаются объекты, создаваемые в приложении программно. Обычно проблема кроется в утечке памяти. Размер задается параметрами -Xms и -Xmx.

java.lang.OutOfMemoryError: PermGen space (до версии Java 8): Данная ошибка возникает при нехватке места в Permanent-области, размер которой задается параметрами -XX:PermSize и -XX:MaxPermSize.

java.lang.OutOfMemoryError: GC overhead limit exceeded: Данная ошибка может возникнуть как при переполнении первой, так и второй областей. Связана она с тем, что памяти осталось мало и сборщик мусора постоянно работает, пытаясь высвободить немного места. Данную ошибку можно отключить с помощью параметра -XX:-UseGCOverheadLimit.

java.lang.OutOfMemoryError: unable to create new native thread: Выбрасывается,
когда нет возможности создавать новые потоки.
Опишите работу блока try-catch-finally
try – данное ключевое слово используется для отметки начала блока кода, который потенциально может привести к ошибке.
catch – ключевое слово для отметки начала блока кода, предназначенного для перехвата и обработки исключений в случае их возникновения.
finally – ключевое слово для отметки начала блока кода, который является дополнительным.
Этот блок помещается после последнего блока catch. Управление передается в блок finally в любом случае, было выброшено исключение или нет.
Общий вид конструкции для обработки исключительной ситуации выглядит следующим образом:
try {
//код, который потенциально может привести к исключительной ситуации
}
catch(SomeException e) { //в скобках указывается класс конкретной ожидаемой ошибки
//код обработки исключительной ситуации
}
finally {
//необязательный блок, код которого выполняется в любом случае
}

1   ...   5   6   7   8   9   10   11   12   ...   25


написать администратору сайта