54 вопроса на знание java core. Как-то мне пришлось на эти вопросы ответить. Надеюсь я нигде не налажал )
-
Что такое класс
Object? Какие в нем есть методы?КлассObject- это базовый класс. Для каждого классаObject- супер класс. Все объекты, включая массивы имплементируют методы этого класса. В нем присутствуют методы:-
boolean equals(Object o) -
void finalize()// вызывается сборщиком мусора, когда gc определил, что ссылок на объект больше нет. -
Class<?> getClass()//возвращает в рантайме класс данного объекта. -
int hashCode() -
void notify()// просыпается одни поток, который ждет на “мониторе” данного объекта. -
void notifyAll()// просыпаются все потоки, которые ждут на “мониторе” данного объекта. -
String toString() -
void wait()// Приводит данный поток в ожидание, пока другой поток не вызовитnotify()илиnotifyAll()методы для этого объекта. -
void wait(long timeout)// Приводит данный поток в ожидание, пока другой поток не вызоветnotify()илиnotifyAll()для этого метода, или пока не исчет указанный промежуток времени. -
void wait(long timeout, int nanos)// nanos - дополнительное время в наносекундах. -
Object clone()// create and returns a copy of this object.
-
-
Что такое метод
equals. Чем он отличается от операции==.Метод, определенный вObject, который служит для сравнение объектов на равенство. При сравнение объектов при помощи==идет сравнение по ссылкам. При сравнении по equals идет сравнение по состояниям объектов (реализация метода equals для нового созданного класса ложится на плечи разработчиков).- Причем равенство должно работать в обе стороны.
- Должно выполняться условие транзитивности.
- Для одних и тех же экземпляров результат работы метода должен быть всегда одинаков.
-
Если вы хотите переопределить
equals, какие условия должны удовлетворяться для переопределенного метода?См. 2). Так же должно выполняться условие, что возвращаемое значение работы методаhashCode()для объектов равных относительно методаequals()должен быть одинаковым. -
Если
equalsпереопределен, есть ли какие-либо другие методы, которые следует переопределить?Да, есть.hashCode(). Для того, чтобы поддержать общий контракт. -
Для чего нужен метод
hashCode?Этот метод используется для хэш таблиц, таких какHashMap. Контракт:-
Когда метод
hashCode()последовательно вызывают на одном и том же объекте, метод должен возвращать в этом случае одни и теже значения, при условии, что никакая информация, которая используется вequals()при сравнении не изменилась. Возвращаемый хэш код может быть различным в различных запущенных приложениях. -
Два объекта равные по
equals()должны возвращать одинаковыйhashCode(). -
Не обязательно, что объекты не равные по
equals()должны возвращать разныеhashCode().
-
Когда метод
-
Какая связь между
hashCodeиequals?См 5) -
Каким образом реализованы методы
hashCodeиequalsв классеObject?В классеObjectметод equals производит сравнение по ссылке, методhashCode()генерироет hash при помощи нативного кода из адреса ссылки. -
Что будет, если переопределить
equalsне переопределяяhashCode? Какие могут возникнуть проблемы?Нарушится контракт. Классы и методы, которые использовали правила этого контракта могут некореектно работать. Так в для объектаHashMapэто может привести к тому, что пара, которая была помещена в мапу возможно не будет найдена в ней при обращении к мапе, если использует новый экземпляр ключа. -
Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете
hashCode?Те, которые используют при определении методаequals(). Хэш код должен быть равномерно распределен на области возможных принимаемых значений. -
Как вы думаете, будут ли какие-то проблемы, если у объекта, который используется в качестве ключа в hashMap изменится поле, которое участвует в определении hashCode?Будут. При обращении по ключу, мы может не найти значение.
-
Какие модификаторы доступа в
Javaвы знаете?-
private, -
protected, -
package-private (default), -
public.
-
-
Какой из модификаторов более строгий:
protectedилиpackage-private?package-private. Поле сpackage-privateуровнем доступа будет видно только в данном пакете всем классам.Тогда как protected видно для наследников данного класса, а так же для классов находящихся в данном пакете. -
Если у класса-родителя есть метод, объявленный как
private, может ли наследник расширить его видимость? А еслиprotected? А сузить видимость?Действует общий принцип: расширять видимость можно, сужать нельзя.Privateметоды видны только внутри класса, для потомков они не видны. Поэтому их и расширить нельзя. -
Что означает ключевое слово
final?Может быть применено к полям, методам или классам. В зависимости к какой сущности приложено данное ключевое слово - будет и различный смысл в его применении.-
Для класса. Класс помеченный при помощи
finalне может иметь наследников. -
Для метода. Метод помеченный при помощи
finalне может быть переопределен в классах наследниках. -
Для поля. Поле помеченное при помощи слова
finalне может изменить свое значение после инициализации (инициализируется либо при описании, либо в конструкторе/статическом блоке). -
Значение локальных переменных, а так же параметров метода помеченных при помощи слова
finalне могут быть изменены после присвоения.
-
Для класса. Класс помеченный при помощи
-
Имеет ли смысл объявлять метод
privatefinal?Нет, такой метод не виден для наследников, а значит не может быть ими переопределен. -
Какие особенности инициализации
finalпеременных?см 14) -
Что будет, если единственный конструктор класса объявлен как
final?К конструктору не применимо ключевое словоfinal. -
Что означает ключевое поле
static?То, что метод, внутренний класс или поле является экземплярами класса. Так же существуетstatic блок, который выполняется при загрузке класса.
И немного проstatic-блоки,init-блокииконструкторыи как они вызываются учитывая иерархию:-
static-блоквызывается при загрузке класса, поэтомуstatic-блокsuper-класса будет вызван раньше, чемstatic-блокнаследника. -
Вызов других конструкций следующий (при создании экземпляра):
init-блокsuper-класса, конструктор super-класса,init-блокнаследника, конструктор наследника. Т.к.init-блоквсегда выполняется перед конструктором, а перед вызовом контруктора наследника всегда вызывается конструктор super-класса. -
init/staticблоки в рамках одного класса вызываются в последовательности определения.
-
-
К каким конструкциям Java применим модификатор
static?- К методу.
- К внутреннему классу.
- К полю.
- К импортируемы классам (с 5-ой java).
-
Что будет, если в
static блокекода возникнет исключительная ситуация?Если в явном виде написать любое исключение вstatic-блоке, то компилятор не скомпилирует исходники. Это все от того, что компилятор умный. В остальном, взаимодействие с исключениями такое же как и в любом другом месте. Если unchecked исключение вывалится вstatic-блоке, то класс не будет инициализирован.
Какой эксепшн вываливается наружу при ошибке в инит/статик блоке? Дляstatic:-
java.lang.ExceptionInInitializerError- если исключение наследуется отRuntimeException.
-
exception, который и вызвал исключение, если он наследуется отRuntimeException.
staticиinit:-
java.lang.Error- если исключение вызваноError. -
java.lang.ThreadDeath- смерть потока. Ничего не вываливается.
-
-
Можно ли перегрузить
static метод?Перезагрузить можно, переописать нельзя. -
Что такое статический класс, какие особенности его использования?Это вложенный класс, который может обращаться только к статическим полям обертывающего его класса, в том числе и приватным. Доступ к нестатическим полям обрамляющего класса может быть осуществлен только через ссылку на экземпляр обрамляющего объекта.
-
Какие особенности инициализации
finalstaticпеременных?Переменный должны быть инициализированы во время объявления или вstatic блоке. -
Какие типы классов бывают в java (вложенные… и.т.д.)
-
Обычные классы (
Top level classes) -
Интерфейсы (
Interfaces) -
Перечисления (
Enum) -
Статические вложенные классы (
Static nested classes)- Есть возможность обращения к внутренним статическим полям и методам класса обертки.
- Внутренние статические интерфейсы могут содерать только статические мотоды.
-
Внутренние классы-члены (
Member inner classes)- Есть возможность обращения к внутренним полям и методам класса обертки.
- Не может иметь статических объявлений.
-
Нельзя объявить таким образом интерфейс. А если его объявить без идентификатора
static, то он автоматически будет добавлен. - Внутри такого класса нельзя объявить перечисления.
-
Если нужно явно получить
thisвнешнего класса -OuterClass.this
-
Локальный класс (
Local inner classes)- Видны только в пределах блока, в котором объявлены.
-
Не могут быть объявлены как
private/public/protectedилиstatic(по этой причине интерфейсы нельзя объявить локально). - Не могут иметь внутри себя статических объявлений (полей, методов, классов).
- Имеют доступ к полям и методам обрамляющего класса.
-
Можно обращаться к локальным переменным и параметрам метода, если они объявлены с модификатором
final.
-
Анонимные классы (
Anonymous inner classes)- Локальный класс без имени.
-
Обычные классы (
-
Каким образом из вложенного класса получить доступ к полю внешнего класса.Если вложенный класс не статический и поле не статическое, то можно просто обратиться к этому полю из внутреннего класса, если только у внутреннего класса не существует поля с таким же литералом, в этом случае нужно обраться через ссылку на внешний класс где-то так -
OuterClass.this -
Какие особенности создания вложенных классов: простых и статических.
См 24) -
Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли каке-нибудь ограничения для такой переменной?По его литералу. Если переменная является
final, то только в этом случае к ней можно обратиться. -
Какие вы знаете способы запустить некоторое действие в отдельном потоке?
1 2 3 4
new Thread(new Runnable() { public void run() {/* blah */} }).start();1 2 3 4
new Thread() { public void run() {/* blah */} }.start();
НаследоватьThreadбудет верным лишь в случае создания другой имплементации потока. Для выполнения какой-нибудь задачи в отдельном потоке использование наследования будет идеологически неверным. -
Какие вы знаете способы прекратить выполнение потока?
-
Thread.stop();// depreceted -
При вызове метода
interrupt(), флаг прерывания устанавливается в true, после чего в потоке должен быть реализован метод его завершения (выход из методаrun()).
-
-
Какие ключевые слова Java, связанные с многопоточностью Вы знаете?
-
valotile- помечает объект, чтобы он не кэшировался отдельно для каждого потока. Все запросы к переменной будут направляться непосредственно в память. -
syhcronized.
-
-
Для чего используется ключевое слово
syhcronized?Для того, чтобы код в этом блоке выполнялся в один момент времени только одним потоком. -
Есть некоторый метод, который исполняет операцию
i++. Переменнаяiтипаint. Предполагается, что код будет исполнятся в многопоточной среде. Следует ли синхронизировать блок?Следует. Инкремент/декремент - не атомарные операции. -
Что служит в качестве
mutex, если метод объявленsynchronized?Экземпляр данного класса. -
Можно ли вызвать в разных потоках два
synchronizedметода одного и того же объекта?Оновременно нельзя. Т.к. методы объявлены какsynchronized, то одноременно оперировать с объектом может только один поток, который получилlock объекта. Поэтому: еслиsynchronizedметод выполняется в первом потоке, чтобы выполнить какой-либоsynchronizedметод объекта во втором потоке, второй поток будет вынужден ждать пока станет доступенlock объекта. -
Что используется в качестве mutex, если метод объявлен
staticsynchronized? Можно ли создавать новые экземпляры класса, пока выполняетсяstaticsynchronizedметод?Монитор класса, который контролирует доступ ко всему синхронизированному статическому коду. Можно -
Объясните, что такое
deadlock? Приведите пример кода, который демонстрируетdeadlockСитуация, когда несколько потоков находятся в состоянии бесконечного ожидания в следствии ожидания освобождения ресурсов, которые сами же и занимают.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
class Entity { public synchronized void method1(Entity entity) { entity.method2(this); } public synchronized void method2(Entity entity) {} public static void main(String[] args) { Entity en1 = new Entity(); Entity en2 = new Entity(); new Thread(new Runnable() { public void run() { en1.method1(en2); } }).start(); new Thread(new Runnable() { public void run() { en2.method1(en1); } }).start(); } } -
Для чего используется ключевое слово
volatile?Не используется кэш (имется ввиду область памети в которойJVMможет сохранять локальную копию переменной, чтобы уменьшить время обращения к переменной) при обращении к полю. -
Для чего используется ключевое слово
transient?Для указание того, что при сериализации/десериализации данное поле не нужно сериализовать/десериализовывать. -
Расскажите о методах
wait,notify,notifyAll. Как они применяются, когда, зачем нужны?-
wait()- Приводит поток в ожидание, пока другой поток не вызовитnotify()илиnotifyAll()методы для этого объекта. При этом все эти методы должны быть вызваны в блоке synchronized. -
notify()- просыпается одни поток, который ждет на “мониторе” данного объекта. -
notifyAll()- просыпаются все потоки, которые ждут на “мониторе” данного объекта.
Эти методы должны вызываться в
блоке synchronized.
Применяются для организации работы потоков. Используется один объект, который выполняет управляющую.
Именно у него и вызываются эти методы.
При вызове одного из этих методов блокировка на объект снимается. -
-
Какие особенности использования метода
wait? При каких условиях поток может выйти из режима ожидания?Так жесм 39).-
Если задан параметр/параметры, определяющий время и если поток не будет разбужен в течении этого времени при помощи методов
notify()илиnotifyAll(), тогда он будет разбужен по прошествии указанного времени. -
Если не задан параметр/параметры, определяющие время, то поток будет разбужен только при помощи методов
notify()илиnotifyAll().
-
Если задан параметр/параметры, определяющий время и если поток не будет разбужен в течении этого времени при помощи методов
-
Предположим в методе run возник
RuntimeException, который не был пойман. Что случится с потоком? Есть ли способ узнать о том, чтоExceptionпроизошел (не заключая все телоrunвблок try-catch)? Есть ли способ восстановить работу потока после того как это произошло?Поток будет остановлен. Нет. Нет. -
Какие стандартные инструменты Java вы бы использовали для реализации пула потоков?
LinkedList,synchronized,wait(),notify()/notifyAll() -
Какие виды исключений в Java вы знаете, чем они отличаются?
checked/unchecked. Еслиcheckedисключение не отлавливается, то это приводит к ошибке на этапе компиляции.Uncheckedисключение - то, которое разработчик не должен допустить, т.к. имеет для этого возможность.
Если исключение потомокRuntimeExceptionилиError, то этоuncheckedисключение. Если исключение потомок Exception (и не потомокRuntimeException), то этоcheckedисключение. -
Назовите несколько классов из вершины иерархии исключений в Java.
Throwable,Error,Exception,RuntimeException. -
Что такое
Error? В каком случае используетсяError. Приведите примерError’а.Используется для сигнализирования того, что произел сбой внутриJVM. Пример классThreadDeath. -
Какая конструкция используется в Java для обработки исключений?
try - catch - finaly -
Возможно ли использование
блока try-finally(безcatch)?Да, если возникающее исключение неcheckedилиcheckedисключение будет передано дальше по иерархии, или если оно будет поймано в ещё одномблоке try. -
Предположим, есть
блок try-finally. Вблоке tryвозникло исключение и выполнение переместилось вблок finally. Вблоке finallyтоже возникло исключение. Какое из двух исключений “выпадет” изблока try-finally? Что случится со вторым исключением?Выпадает, то есть, не передается по иерархии вызовов первое исключение. И оно просто не попадет в иерархию вызовов. -
Всегда ли исполняется
блок finally?Только если поток ещё исполняется иJVMещё работает к этому моменту. -
Могли бы вы придумать ситуацию, когда
блок finallyне будет выполнен?Мог бы.1 2 3 4 5 6
try { System.exit(1); } finaly { System.out.println("42"); } -
Предположим, есть метод, который может выбросить
IOExceptionиFileNotFoundExceptionв какой последовательности должны идтиблоки catch? Сколькоблоков catchбудет выполнено?ВначелеFileNotFoundExceptionзатемIOException. Один. -
Предположим вам необходимо создать свой собственный класс
Exception. Какими мотивами вы будете руководствоваться при выборе типа исключения:checked/unchecked?Если исключение возникло из-за того, что клиент нарушал контракт, то это unchecked exeption. Если же исключение возникло по какой-нибудь другой причине, то этоcheckedexeption. -
Что такое
finalize? Зачем он нужен? Что Вы можете рассказать о сборщике мусора и алгоритмах его работы.Методfinalize()вызывается перед тем, как объект будет удаленgc. Существует много различных реализацийgc. Основа работы следующая,gcпомечает объекты на которых больше не ссылаются другие объекты для их удаления. Затем на одном из проходов помеченные объекты удаляются.
Вызовfinalize()не гарантируется, т.к. приложение может быть завершено до того, как будет запущена ещё одна сборка мусора. Да, можно отменить сборку объекта с помощью методаfinalize(), присвоив его ссылку какому-то статистическому мето -
Почему метод
cloneобъявлен какprotected? Что необходимо для реализации клонирования?Это сигнализирует о том, что хоть метод и есть в классеObject, но если им разработчик желает воспользоваться, то его нужно переопределить. Для этого нужно реализовать интерфейсClonable, чтобы соблюсти контракт.