10 популярных вопросов с Java-собеседований
Есть вопросы, которые постоянно попадаются на собеседованиях, и на которые ты всё время забываешь ответы? Вот 10 самых распространенных вопросов для джавистов!
Уточнение: здесь не расшифрован ответ полностью, а лишь предоставляется краткое описание. Развернутую версию ответа тебе придется искать в сети самостоятельно.
ООП
На Java пишут только с использованием этой парадигмы. Мысль писать код в процедурном стиле следует откинуть и больше не вспоминать. Идеально, если ты придешь к использованию ООП самостоятельно, понимая его удобство.
Основные принципы ООП – абстракция, наследование, инкапсуляция и полиморфизм. Вместе с наследованием используйте делегацию, композицию и агрегацию. И, пожалуйста, Don’t repeat yourself (DRY)! Подробнее расписано в тематической статье. Также почитай о принципе подстановки Барбары Лисков.
Почему Java?
Тут все просто. За счет кроссплатформенности, многопоточности, удобного ООП, элементарного синтаксиса и мощи Sun/Oracle Java стала крутой и популярной. На этом языке написана уйма серверов, крупных проектов и даже микроволновок.
Не поверишь, но в качестве языка для бекенда Java превосходит PHP на голову. На последнем написано довольно мало проектов, не считая CMS. Самые большие системы основаны на Java. Есть jsoup для парсинга HTML, есть RestTemplate для опроса рестов, есть Cucumber и Selenium для имитации действий пользователя в браузере. Плюс ты всегда можешь создать гибридное решение PHP + Java.
Как работает Java?
Основная проблема большинства новичков – переход от теоретической базы о языках программирования к "Hello World!", а ведь именно основы Java хранят в себе все секреты.
JDK (Java Development Kit) – набор необходимых инструментов, позволяющих развернуть Java на любой платформе, программировать и компилировать код.
JRE (Java Runtime Environment) – это то место, где находится JVM (виртуальная машина), весь запущенный рантайм и загруженные классы, т. е. все, что нужно для работы и функционирования кода.
JVM (Java Virtual Machine) – основная штука, с помощью которой кроссплатформенность в принципе возможна. Все примерно так:
- написанный код компилируется в байт-код, который может запускаться на этой виртуалке;
- виртуалка интерпретирует весь код в машинный код для конкретной платформы.
JIT (Just-in-time) – оптимизированная штука от Java, чем-то похожая на precompiled header из C++.
JNA (Java Native Access) – способ из Java вызывать нативный код для решения некоторых задач.
Разница между интерфейсом и абстрактным классом
Лучший способ продемонстрировать разницу между этими фичами – раскрыть секреты Java и рассказать, что умеет делать каждый из “конкурсантов”.
Абстрактные классы могут иметь константы и переменные, определенные и объявленные методы с любыми модификаторами доступа.
Интерфейсы включают в себя только константы и только объявление методов с публичным доступом. Интерфейсы участвуют в имитации множественного наследования, а в случае с классом, он может наследоваться только от одного класса-родителя.
Пожалуй, самая важная тема для понимания, не осознав ее, тебе будет очень сложно вникнуть в суть Java.
Ключевое слово static
Статическими могут быть как переменные, так и методы. Переменные экземпляров, объявленные как static
, являются глобальными переменными. При объявлении объектов не создается никаких копий статической переменной. Вместо этого все экземпляры класса совместно используют одну и ту же статическую переменную.
Статические методы могут вызывать только другие статические методы, умеют обращаться только к статическим переменным и не могут ссылаться на this
и super
(о них тоже почитай).
final
Данное ключевое слово может применяться к методам, классам и переменным. Если это:
- Класс, то от него нельзя наследоваться.
- Метод, то его нельзя переопределять в саб-классах.
- Переменная, то это константа.
Примитивы и объекты
К примитивам Java относится
byte
, short
, char
, int
, long
, float
, double
, boolean
, а кастомные типы
данных (класс String) формируются уже из примитивов. Примитивы несут
в себе значение, а не ссылки, как многие заблуждаются. Забегая вперед, можно
сказать, что для примитивов юзается стек, а для объектов – куча. Вот такой
обширный вопрос. Обязательно разберись:
- в типах памяти
- для чего какой тип используется
- боксинг/анбоксинг
- классы-обертки
Передача по ссылке или по значению
В С++ и С есть понятие чистых указателей и ссылок. В языке Java (являющимся улучшенной версией C++) указатели сделали
неявными для упрощения кода. Когда создается объект, то ссылка на объект
хранит в себе адрес в памяти того объекта, который был создан с помощью
оператора new
. Если такую ссылку передать в качестве параметра
функции, то в том месте, где она передается, будет создана копия, поэтому
передача произойдет по значению. Но данная копия будет ссылаться на тот адрес,
на который ссылается и оригинал. Если произвести действия над этой копией,
оригинал тоже будет изменен. Это как указатель в C++, только
разыменование происходит автоматически и неявно.
Такое поведение работает только в случае с объектами. С примитивами все проще: передав примитив в метод и изменив его там, будет изменяться копия, и это не повлияет на глобальные значения. Это важно!
Анонимные классы
Существуют обычные классы и вложенные. Вложенные делятся еще на несколько видов, и среди них есть анонимный внутренний класс. Если коротко, то это класс без имени, который находится внутри другого класса.
Перегрузка и переопределение
Переопределение позволяет взять какой-то метод родительского класса и написать в каждом классе-наследнике свою реализацию этого метода.
Чтобы понять перегрузку, нужно запомнить, что тип и/или число параметров в каждом из перегружаемых классов должно быть разным.
Эта тема – ключ к пониманию, как работает полиморфизм.
Итого
Если ты в конце разберешься с этой подборкой и сможешь на каждый из вопросов привести пример, то ты освоил основной пласт информации, до которого обязательно докопаются на собеседовании по Java ;)