Flashcards
Java core questions (1)

Flashcards do conjunto (23)
- 1ЧЕМ ОТЛИЧАЕТСЯ JRE, JVM И JDK?JRE кратко - для работы. Java Runtime Environment (сокр. JRE) - минимальная реализация виртуальной машины, необходимая для исполнения Java-приложений, без компилятора и других средств разработки. Состоит из виртуальной машины - Java Virtual Machine и библиотеки Java-классов.
JDK кратко - для программирования. Java Development Kit (сокращенно JDK) - бесплатно распространяемый компанией Oracle Corporation (ранее Sun Microsystems) комплект разработчика приложений на языке Java, включающий в себя компилятор Java (javac), стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему Java (JRE).
Java Virtual Machine (сокращенно Java VM, JVM) - виртуальная машина Java - основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java интерпретирует Байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM может также использоваться для выполнения программ, написанных на других языках программирования. - 2ОПИШИТЕ МОДИФИКАТОРЫ ДОСТУПА В JAVA.В Java существуют следующие модификаторы доступа:
private: (используется конструкторах, внутренних классах, методах и полях класса) - Доступ разрешен только в текущем классе.
default (package-private): (используется в классах, конструкторах, интерфейсах, внутренних классах, методах и полях класса) - Доступ на уровне пакета. Если класс будет так объявлен он будет доступен только внутри пакета.
protected: (используется конструкторах, внутренних классах, методах и полях класса) Модификатор доступа на уровне пакета и в иерархии наследования.
public: (используется в классах, конструкторах, интерфейсах, внутренних классах, методах и полях класса) - Модификатор доступа общественный, доступен всем.
Последовательность модификаторов по убыванию уровня закрытости: private, default ,protected, public). - 3ЧТО ТАКОЕ PACKAGE LEVEL ACCESS.Доступ из классов одного package-а в классы другого package-a.
- 4ЧЕМ АБСТРАКТНЫЙ КЛАС ОТЛИЧАЕТСЯ ОТ ИНТЕРФЕЙСА? В КАКИХ СЛУЧАЯХ ВЫ БЫ ИСПОЛЬЗОВАЛИ АБСТРАКТНЫЙ КЛАСС, А В КАКИХ ИНТЕРФЕЙС?Абстрактный класс это класс, который помечен как "abstract", он может содержать абстрактные методы, а может их и не содержать.
Экземпляр абстрактного класса нельзя создать.
Класс, который наследуется от абстрактного класса может реализовывать абстрактные методы, а может и не реализовывать, тогда класс наследник должен быть тоже абстрактным. Также если класс наследник переопределяет реализованный в абстрактном классе родители метод, его можно переопределить с модификатором абстракт! Т.е отказаться от реализации. Соответственно данный класс должен быть также абстрактным также.
Что касается интерфейса, то в нем находятся только абстрактные методы и константы. При реализации интерфейса, класс обязан реализовать все методы интерфейса. Иначе класс должен быть помечен как абстрактный.
Интересный момент, интерфейс может содержать внутренние классы! И не абстрактные методы в них.
Что же использовать Интерфейс или Абстрактный класс?
Абстрактный класс используется когда нам нужна какая-то реализация по умолчанию. Интерфейс используется когда классу нужно указать конкретное поведение. Ча - 5МОЖЕТ ЛИ ОБЪЕКТ ПОЛУЧИТЬ ДОСТУП К PRIVATE-ПЕРЕМЕННОЙ КЛАССА? ЕСЛИ, ДА, ТО КАКИМ ОБРАЗОМ?Вообще доступ у приватной переменной класса можно получить только внутри класса, в котором она объявлена. Также доступ к приватным переменным можно осуществить через механизм Java Reflection API.
- 6ДЛЯ ЧЕГО В ДЖАВЕ СТАТИЧЕСКИЕ БЛОКИ?Статические блоки в джава выполняются до выполнения конструктора, с помощью них инициализируют статические поля
- 7МОЖНО ЛИ ПЕРЕГРУЗИТЬ STATIC МЕТОД?Статические методы могут перегружаться нестатическими и наоборот - без ограничений. А вот в переопределении статического метода смысла нет.
- 8РАССКАЖИТЕ ПРО ВНУТРЕННИЕ КЛАССЫ. КОГДА ВЫ ИХ БУДЕТЕ ИСПОЛЬЗОВАТЬ?Внутренний класс - это класс, который находится внутри класса или интерфейса. При этом он получает доступ ко всем полям и методам своего внешнего класса.
Для чего он может применятся? Например чтоб обеспечить какую-то дополнительную логику класса. Хотя использование внутренних классов усложняет программу, рекомендуется избегать их использование. - 9В ЧЕМ РАЗНИЦА МЕЖДУ ПЕРЕМЕННОЙ ЭКЗЕМПЛЯРА И СТАТИЧЕСКОЙ ПЕРЕМЕННОЙ? ПРИВЕДИТЕ ПРИМЕР.Статические переменные инициализируются при загрузке класса класслодером, и не зависят от объекта. Переменная экземпляра инициализируется при создании класса.
Пример: Например нам нужна глобальная переменная для всех объектов класс, например число посещений пользователей определенной статьи в интернете. При каждом новом посещении статьи создается новый объект и инкрементируется переменная посещений. - 10ПРИВЕДИТЕ ПРИМЕР КОГДА МОЖНО ИСПОЛЬЗОВАТЬ СТАТИЧЕСКИЙ МЕТОД?Статические методы могут быть использованы для инициализации статических переменных. Часто статические методы используются в классах утилитах, таких как Collections, Math, Arrrays
- 11РАССКАЖИТЕ ПРО КЛАССЫ- ЗАГРУЗЧИКИ И ПРО ДИНАМИЧЕСКУЮ ЗАРУЗКУ КЛАССОВ.Любой класс, используемый в джава программу так или иначе был загружен в контекст программы каким-то загрузчиком.
Все виртуальные машины джава включают хотябы один загрузчик классов, так называем базовый загрузчик. Он загружает все основные классы, это классы из rt.jar. Интересно то, что этот загрузчик никак не связан с программой, тоесть мы не можем получить например у java.lang.Object имя зарузчика, метод getClassLoader() вернет нам null.
Следующий загрузчик - это загрузчик расширений, он загружает классы из $JAVA_HOME/lib/ext.
Далее по иерархии идет системный загрузчик, он загружает классы, путь к которым указан в переменно класпас.
Для примера предположим что у нас есть некий пользовательский класс MyClass и мы его используем. Как идет его загрузка… :
Сначала системный загрузчик пытается найти его в своем кэше загрузок его, если найден - класс успешно загружается, иначе управление загрузкой передается загрузчику расширений, он также проверяет свой кэш загрузок и в случае неудачи передает задачу базовому загрузчику. Тот проверяет кэш и в случае неудачи пытается - 12ДЛЯ ЧЕГО НУЖЕН ОПЕРАТОР "ASSERT" В ДЖАВА?Это так называемый оператор утверждений. Он проверяет некое условие, если оно ложно, то генерируется AssertationError
assert status: "message error";
Тут проверяется булевская переменная "status". - 13ПОЧЕМУ В НЕКОТОРЫХ ИНТЕРФЕЙСАХ ВООБЩЕ НЕ ОПРЕДЕЛЯЮТ МЕТОДОВ?Это так называемые интерфейсы - маркеры. Они просто указывают что класс относится к определенной группе классов. Например интерфейс Clonable указывает на то, что класс поддерживает механизм клонирования.
Степень абстракции в данном случае доведен до абсолюта. В интерфейсе вообще нет никаких объявлений.
Интерфейси-маркери в Java:
Searilizable interface
Cloneable interface
Remote interface
ThreadSafe interface - 14КАКАЯ ОСНОВНАЯ РАЗНИЦА МЕЖДУ STRING, STRINGBUFFER, STRINGBUILDER?String - неизменяемый класс, тоесть для для добавление данных в уже существующую строку, создается новый объект строки.
StringBuffer и StringBuilder могут изменятся и добавление строки не такое дорогостоющее с точки зрения памяти. Первы - синхронизированный, второй - нет. Это их единственное различие.
Правда если нам нужно сделать подстроку строки, то лучше использовать String, так как ее массив символов не меняется и не создается заново для новой строки. А вот в StringBuffer и StringBuilder для создания подстроки создается новый массив символов. - 15РАССКАЖИТЕ ПРО ПОТОКИ ВВОДА-ВЫВОДА JAVA.Потоки ввода-вывода бывают двух видов:
байтовый поток(InputStream и OutputStream);
символный поток(Reader и Writer);
Это все абстрактные классы - декораторы, которым можно добавлять дополнительный функционал, например:
InputStream in = new FileInputStream(new File("file.txt")); - 16ЧТО ТАКОЕ HEAP И STACK ПАМЯТЬ В JAVA?Java Heap (куча) - динамически распредляемая область памяти, создаваемая при старте JVM. Используется Java Runtime для выделения памяти под объекты и JRE классы. Создание нового объекта также происходит в куче. Здесь работает сборщик мусора: освобождает память путем удаления объектов, на которые нет каких-либо ссылок. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться с любой части приложения.
Cтрогими тезами:
Все обьекты обитают в куче и попадают туда при создании.
обьект состоит из полей класса и методов.
в куче выделяется место под сам обьект, количество выделенной памяти зависит от полей, если у тебя полем класса, к примеру, служит интовая переменная, то не важно, инициализируешь ты ее как "0" или как "1000000" - обьект займет в куче свои биты, + столько байт сколько вмещает тип int(+32 бита), и так с каждым полем.
Стековая память в Java работает по схеме LIFO (Последний-зашел-Первый-вышел). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе расположение в RAM - 17КАКАЯ РАЗНИЦА МЕЖДУ STACK И HEAP ПАМЯТЬЮ В JAVA?Приведем следующие различия между Heap и Stack памятью в Java.
Куча используется всеми частями приложения в то время как стек используется только одним потоком исполнения программы.
Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче.
Объекты в куче доступны с любой точки программы, в то время как стековая память не может быть доступна для других потоков.
Управление памятью в стеке осуществляется по схеме LIFO.
Стековая память существует лишь какое-то время работы программы, а память в куче живет с самого начала до конца работы программы.
Мы можем использовать -Xms и -Xmx опции JVM, чтобы определить начальный и максимальный размер памяти в куче. Для стека определить размер памяти можно с помощью опции -Xss .
Если память стека полностью занята, то Java Runtime бросает java.lang.StackOverflowError, а если память кучи заполнена, то бросается исключение java.lang.OutOfMemoryError: Java Heap Space.
Размер памяти стека намного меньше - 18РАССКАЖИТЕ ПРО МОДЕЛЬ ПАМЯТИ В ДЖАВА?В Джаве память устроена следующим образом, есть два вида:
куча
стек
Куча состоит из статического контекста и самой кучи
Перейдем к куче. Куча состоит из двух частей:
Новая куча
Старая куча
Новая куча в свою очередь состоит из двух частей:
Eden(назовем ее первая) куча
Survival(выжившая) куча
Краткое описание:
Eden Space (heap) - в этой области выделятся память под все создаваемые из программы объекты. Большая часть объектов живет недолго (итераторы, временные объекты, используемые внутри методов и т.п.), и удаляются при выполнении сборок мусора это области памяти, не перемещаются в другие области памяти. Когда данная область заполняется (т.е. количество выделенной памяти в этой
- 19КАК РАБОТАЕТ СБОРЩИК МУСОРА (GARBAGE COLLECTOR)?Во-первых что стоит сказать, что у сборщика мусора есть несколько алгоритмов работы, он не один.
Когда происходит очистка памяти? Если память в Первой куче полностью заполнена, то туда идет сборщик мусора и делает свою работу) Какую именно, зависит от обстоятельств… Например если в первой кучи много мусора(т.е. объектов с нулевой ссылкой), то сборщик мусора помечает эти объекты, далее те что остались объекты со ссылками он их переносит в Выжившую кучу, а в первой куче он просто все удаляет.
Ситуация другая, в первой кучи мало мусора, но очень много рабочих объектов. Как поступает в этом случае сборщик мусора?
Он помечает мусор, удаляет его и оставшиеся объекты компонует.
Также следует заметить что при нехватке места в Выжившей куче, объекты переносятся в старую кучу, там хранятся как правило долго живущие объекты.
Также следует заметить что сборщик мусора вызывается сам периодически, а не только когда памяти не хватает. - 20РАССКАЖИТЕ ПРО ПРИВЕДЕНИЕ ТИПОВ. ЧТО ТАКОЕ ПОНИЖЕНИЕ И ПОВЫШЕНИЕ ТИПА? КОГДА ВЫ ПОЛУЧАЕТЕ CLASSCASTEXCEPTION?Приведение типов это установка типа переменной или объекта отличного от текущего. В ждава есть два вида приведения:
автоматическое
не автоматическое
Автоматическое происходит например:
byte-> short->int->long->float->double
тоесть если мы расширяем тип, то явное преобразование не требуется, приведение происходит автоматически. Если же мы сужаем, то необходимо явно указывать приведение типа.
В случае же с объектами, то мы можем сделать автоматическое приведение от наследника к родителю, но никак не наоборот, тогда вылетит ClassCastException. - 21ЧТО ТАКОЕ СТАТИЧЕСКИЙ КЛАСС, КАКИЕ ОСОБЕННОСТИ ЕГО ИСПОЛЬЗОВАНИЯ?Статическим классом может быть только внутренний клас(определение класса размещается внутри другого класса). В объекте обычного внутреннего класса хранится ссылка на объект внешнего класса. Внутри статического внутреннего класса такой ссылки нет.
То есть: Для создания объекта статического внутреннего класса не нужен объект внешнего класса. Из объекта статического вложенного класса нельзя обращаться к нестатическим членам внешнего класса напрямую. И еще обычные внутренние классы не могут содержать статические методы и члены.
Зачем вообще нужны внутренние классы? – Каждый внутренний класс способен независимо наследовать определенную реализацию. Таким образом внутренний класс не ограничен при наследовании в ситуациях, когда внешний класс уже наследует реализацию. То есть это как бы вариант решения проблемы множественного наследования. - 22КАКИМ ОБРАЗОМ ИЗ ВЛОЖЕННОГО КЛАССА ПОЛУЧИТЬ ДОСТУП К ПОЛЮ ВНЕШНЕГО КЛАССА.Если класс внутренний то: Внешнийкласс.this.Поле внешнего класса Если класс статический внутренний(вложенный),то в методе нужно создать объект внешнего класса, и получить доступ к его полю.Или второй вариант объявить это поле внешнего класса как static
- 23КАКИЕ СУЩЕСТВУЮТ ТИПЫ ВЛОЖЕННЫХ КЛАССОВ? ДЛЯ ЧЕГО ОНИ ИСПОЛЬЗУЮТСЯ?Вложенные классы существуют внутри других классов. Нормальный класс - полноценный член пакета. Вложенные классы, которые стали доступны начиная с Java 1.1, могут быть четырех типов:
статические члены класса
члены класса
локальные классы
анонимные классы
Статические члены классов (static nested classes) - как и любой другой статический метод, имеет доступ к любым статическим методам своего внешнего класса, в том числе и к приватным. К нестатическим полям и методам обрамляющего класса он не может обращатся напрямую. Он может использовать их только через ссылку на экземпляр класса родителя.
Члены класса - локальные классы, объявленные внутри блока кода. Эти классы видны только внутри блока.
Анонимные классы - Эти типы классов не имеют имени и видны только внутри блока.
Informações
- Descrição
- Ответы на вопросы на собеседование Java core (часть 1)
- Criado por
- Usuário eliminado · ago 2017
- Atualizado
- 23 ago 2017
- Visualizações
- 74
- Tags
- Histórico
-
- Criado por um usuário excluído · 6 dez 2016
- Copiado por Павел Караваев · 23 ago 2017
- Avaliação