Fix title's formatting issues
This commit is contained in:
parent
d90e72d11b
commit
b68ab0df62
42
README.md
42
README.md
|
@ -1,4 +1,4 @@
|
|||
#Вопросы для собеседования на Java Junior
|
||||
# Вопросы для собеседования на Java Junior
|
||||
|
||||
+ [ООП](#ООП) ![icon][done]
|
||||
+ [Java Core](#java-core) ![icon][done]
|
||||
|
@ -22,7 +22,7 @@
|
|||
|
||||
[done]:done.png
|
||||
|
||||
##ООП
|
||||
## ООП
|
||||
+ [Что такое _ООП_?](oop.md#Что-такое-ООП)
|
||||
+ [Назовите основные принципы _ООП_.](oop.md#Назовите-основные-принципы-ООП)
|
||||
+ [Что такое _«инкапсуляция»_?](oop.md#Что-такое-инкапсуляция)
|
||||
|
@ -38,7 +38,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Java Core
|
||||
## Java Core
|
||||
+ [Чем различаются JRE, JVM и JDK?](core.md#Чем-различаются-jre-jvm-и-jdk)
|
||||
+ [Какие существуют модификаторы доступа?](core.md#Какие-существуют-модификаторы-доступа)
|
||||
+ [О чем говорит ключевое слово `final`?](core.md#О-чем-говорит-ключевое-слово-final)
|
||||
|
@ -149,7 +149,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Java Collections
|
||||
## Java Collections
|
||||
+ [Что такое _«коллекция»_?](jcf.md#Что-такое-коллекция)
|
||||
+ [Назовите основные интерфейсы JCF и их реализации.](jcf.md#Назовите-основные-интерфейсы-jcf-и-их-реализации)
|
||||
+ [Расположите в виде иерархии следующие интерфейсы: `List`, `Set`, `Map`, `SortedSet`, `SortedMap`, `Collection`, `Iterable`, `Iterator`, `NavigableSet`, `NavigableMap`.](jcf.md#Расположите-в-виде-иерархии-следующие-интерфейсы-list-set-map-sortedset-sortedmap-collection-iterable-iterator-navigableset-navigablemap)
|
||||
|
@ -240,7 +240,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Java 8
|
||||
## Java 8
|
||||
+ [Какие нововведения, появились в Java 8 и JDK 8?](java8.md#Какие-нововведения-появились-в-java-8-и-jdk-8)
|
||||
+ [Что такое _«лямбда»_? Какова структура и особенности использования лямбда-выражения?](java8.md#Что-такое-лямбда-Какова-структура-и-особенности-использования-лямбда-выражения)
|
||||
+ [К каким переменным есть доступ у лямбда-выражений?](java8.md#К-каким-переменным-есть-доступ-у-лямбда-выражений)
|
||||
|
@ -306,7 +306,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Потоки ввода/вывода в Java
|
||||
## Потоки ввода/вывода в Java
|
||||
+ [В чём заключается разница между IO и NIO?](io.md#В-чём-заключается-разница-между-io-и-nio)
|
||||
+ [Какие особенности NIO вы знаете?](io.md#Какие-особенности-nio-вы-знаете)
|
||||
+ [Что такое _«каналы»_?](io.md#Что-такое-каналы)
|
||||
|
@ -338,7 +338,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Сериализация
|
||||
## Сериализация
|
||||
+ [Что такое _«сериализация»_?](serialization.md#Что-такое-сериализация)
|
||||
+ [Опишите процесс сериализации/десериализации с использованием `Serializable`.](serialization.md#Опишите-процесс-сериализациидесериализации-с-использованием-serializable)
|
||||
+ [Как изменить стандартное поведение сериализации/десериализации?](serialization.md#Как-изменить-стандартное-поведение-сериализациидесериализации)
|
||||
|
@ -354,7 +354,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Многопоточность
|
||||
## Многопоточность
|
||||
+ [Расскажите о модели памяти Java?](concurrency.md#Расскажите-о-модели-памяти-java)
|
||||
+ [Что такое «потокобезопасность»?](concurrency.md#Что-такое-потокобезопасность)
|
||||
+ [Что такое _«кооперативная многозадачность»_? Какой тип многозадачности использует Java? Чем обусловлен этот выбор?](concurrency.md#Что-такое-кооперативная-многозадачность-Какой-тип-многозадачности-использует-java-Чем-обусловлен-этот-выбор)
|
||||
|
@ -427,7 +427,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Servlets, JSP, JSTL
|
||||
## Servlets, JSP, JSTL
|
||||
+ [Что такое _«сервлет»_?](servlets.md#Что-такое-сервлет)
|
||||
+ [В чем заключаются преимущества технологии сервлетов над CGI (Common Gateway Interface)?](servlets.md#В-чем-заключаются-преимущества-технологии-сервлетов-над-cgi-common-gateway-interface)
|
||||
+ [Какова структура веб-проекта?](servlets.md#Какова-структура-веб-проекта)
|
||||
|
@ -524,7 +524,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Базы данных
|
||||
## Базы данных
|
||||
+ [Что такое _«база данных»_?](db.md#Что-такое-база-данных)
|
||||
+ [Что такое _«система управления базами данных»_?](db.md#Что-такое-система-управления-базами-данных)
|
||||
+ [Что такое _«реляционная модель данных»_?](db.md#Что-такое-реляционная-модель-данных)
|
||||
|
@ -547,7 +547,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##SQL
|
||||
## SQL
|
||||
+ [Что такое _«SQL»_?](sql.md#Что-такое-sql)
|
||||
+ [Какие существуют операторы SQL?](sql.md#Какие-существуют-операторы-sql)
|
||||
+ [Что означает `NULL` в SQL?](sql.md#Что-означает-null-в-sql)
|
||||
|
@ -586,7 +586,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##JDBC
|
||||
## JDBC
|
||||
+ [Что такое _JDBC_?](jdbc.md#Что-такое-jdbc)
|
||||
+ [В чем заключаются преимущества использования JDBC?](jdbc.md#В-чем-заключаются-преимущества-использования-jdbc)
|
||||
+ [Что из себя представляет JDBC URL?](jdbc.md#Что-из-себя-представляет-jdbc-url)
|
||||
|
@ -604,7 +604,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Тестирование
|
||||
## Тестирование
|
||||
+ [Что такое _«модульное тестирование»_?](test.md#Что-такое-модульное-тестирование)
|
||||
+ [Что такое _«интеграционное тестирование»_?](test.md#Что-такое-интеграционное-тестирование)
|
||||
+ [Чем интеграционное тестирование отличается от модульного?](test.md#Чем-интеграционное-тестирование-отличается-от-модульного)
|
||||
|
@ -616,7 +616,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Журналирование
|
||||
## Журналирование
|
||||
+ [Какие существуют типы логов?](log.md#Какие-существуют-типы-логов)
|
||||
+ [Из каких частей состоит система журналирования log4j?](log.md#Из-каких-частей-состоит-система-журналирования-log4j)
|
||||
+ [Что такое _Logger_ в log4j?](log.md#Что-такое-logger-в-log4j)
|
||||
|
@ -627,7 +627,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##UML
|
||||
## UML
|
||||
+ [Что такое _UML_?](uml.md#Что-такое-uml)
|
||||
+ [Что такое _«диаграмма»_, _«нотация»_ и _«метамодель»_ в UML?](uml.md#Что-такое-диаграмма-нотация-и-метамодель-в-uml)
|
||||
+ [Какие существуют типы диаграмм?](uml.md#Какие-существуют-типы-диаграмм)
|
||||
|
@ -635,7 +635,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##XML
|
||||
## XML
|
||||
+ [Что такое _XML_?](xml.md#Что-такое-xml)
|
||||
+ [Что такое _DTD_?](xml.md#Что-такое-dtd)
|
||||
+ [Чем _well-formed XML_ отличается от _valid XML_?](xml.md#Чем-well-formed-xml-отличается-от-valid-xml)
|
||||
|
@ -650,7 +650,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Шаблоны проектирования
|
||||
## Шаблоны проектирования
|
||||
+ [Что такое _«шаблон проектирования»_?](patterns.md#Что-такое-шаблон-проектирования)
|
||||
+ [Назовите основные характеристики шаблонов.](patterns.md#Назовите-основные-характеристики-шаблонов)
|
||||
+ [Типы шаблонов проектирования.](patterns.md#Типы-шаблонов-проектирования)
|
||||
|
@ -663,7 +663,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Основы HTML
|
||||
## Основы HTML
|
||||
+ [Что такое _«HTML»_?](html.md#Что-такое-html)
|
||||
+ [Что такое _«XHTML»_?](html.md#Что-такое-xhtml)
|
||||
+ [Что такое `DOCTYPE` и зачем он нужен?](html.md#Что-такое-doctype-и-зачем-он-нужен)
|
||||
|
@ -682,7 +682,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Основы CSS
|
||||
## Основы CSS
|
||||
+ [Что такое _«CSS»_?](css.md#Что-такое-css)
|
||||
+ [Как в CSS обозначаются комментарии?](css.md#Как-в-css-обозначаются-комментарии)
|
||||
+ [Что такое _«селектор»_?](css.md#Что-такое-селектор)
|
||||
|
@ -700,7 +700,7 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Основы WEB
|
||||
## Основы WEB
|
||||
+ [Что такое _WWW_?](web.md#Что-такое-www)
|
||||
+ [Что такое _W3C_?](web.md#Что-такое-w3c)
|
||||
+ [Какие существуют уровни модели _OSI_?](web.md#Какие-существуют-уровни-модели-osi)
|
||||
|
@ -726,5 +726,5 @@
|
|||
|
||||
[к оглавлению](#Вопросы-для-собеседования-на-java-junior)
|
||||
|
||||
##Источники
|
||||
## Источники
|
||||
+ [Вопросы на собеседование Junior Java Developer](https://jsehelper.blogspot.ru)
|
||||
|
|
218
core.md
218
core.md
|
@ -1,6 +1,6 @@
|
|||
[Вопросы для собеседования на Java Developer](README.md)
|
||||
|
||||
#Java Core
|
||||
# Java Core
|
||||
+ [Чем различаются JRE, JVM и JDK?](#Чем-различаются-jre-jvm-и-jdk)
|
||||
+ [Какие существуют модификаторы доступа?](#Какие-существуют-модификаторы-доступа)
|
||||
+ [О чем говорит ключевое слово `final`?](#О-чем-говорит-ключевое-слово-final)
|
||||
|
@ -109,7 +109,7 @@
|
|||
+ [Что такое _generics_?](#Что-такое-generics)
|
||||
+ [Что такое _«интернационализация»_, _«локализация»_?](#Что-такое-интернационализация-локализация)
|
||||
|
||||
##Чем различаются JRE, JVM и JDK?
|
||||
## Чем различаются JRE, JVM и JDK?
|
||||
__JVM__, Java Virtual Machine (Виртуальная машина Java) — основная часть среды времени исполнения Java (JRE). Виртуальная машина Java исполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java. JVM может также использоваться для выполнения программ, написанных на других языках программирования.
|
||||
|
||||
__JRE__, Java Runtime Environment (Среда времени выполнения Java) - минимально-необходимая реализация виртуальной машины для исполнения Java-приложений. Состоит из JVM и стандартного набора библиотек классов Java.
|
||||
|
@ -120,7 +120,7 @@ __JDK__, Java Development Kit (Комплект разработки на Java)
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какие существуют модификаторы доступа?
|
||||
## Какие существуют модификаторы доступа?
|
||||
__private__ (приватный): члены класса доступны только внутри класса. Для обозначения используется служебное слово `private`.
|
||||
|
||||
__default__, package-private, package level (доступ на уровне пакета): видимость класса/членов класса только внутри пакета. Является модификатором доступа по умолчанию - специальное
|
||||
|
@ -136,7 +136,7 @@ __public__ (публичный): класс/члены класса доступ
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##О чем говорит ключевое слово `final`?
|
||||
## О чем говорит ключевое слово `final`?
|
||||
Модификатор `final` может применяться к переменным, параметрам методов, полям и методам класса или самим классам.
|
||||
|
||||
+ Класс не может иметь наследников;
|
||||
|
@ -147,7 +147,7 @@ __public__ (публичный): класс/члены класса доступ
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какими значениями инициализируются переменные по умолчанию?
|
||||
## Какими значениями инициализируются переменные по умолчанию?
|
||||
+ Числа инициализируются `0` или `0.0`;
|
||||
+ `char` — `\u0000`;
|
||||
+ `boolean` — `false`;
|
||||
|
@ -155,7 +155,7 @@ __public__ (публичный): класс/члены класса доступ
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что вы знаете о функции `main()`?
|
||||
## Что вы знаете о функции `main()`?
|
||||
|
||||
Метод `main()` — точка входа в программу. В приложении может быть несколько таких методов. Если метод отсутствует, то компиляция возможна, но при запуске будет получена ошибка _\`Error: Main method not found\`_.
|
||||
|
||||
|
@ -165,7 +165,7 @@ public static void main(String[] args) {}
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какие логические операции и операторы вы знаете?
|
||||
## Какие логические операции и операторы вы знаете?
|
||||
+ `&`: Логическое _AND_ (И);
|
||||
+ `&&`: Сокращённое _AND_;
|
||||
+ `|`: Логическое _OR_ (ИЛИ);
|
||||
|
@ -181,7 +181,7 @@ public static void main(String[] args) {}
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что такое тернарный оператор выбора?
|
||||
## Что такое тернарный оператор выбора?
|
||||
Тернарный условный оператор `?:` - оператор, которым можно заменить некоторые конструкции операторов `if-then-else`.
|
||||
|
||||
Выражение записывается в следующей форме:
|
||||
|
@ -191,7 +191,7 @@ public static void main(String[] args) {}
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какие побитовые операции вы знаете?
|
||||
## Какие побитовые операции вы знаете?
|
||||
+ `~`: Побитовый унарный оператор NOT;
|
||||
+ `&`: Побитовый AND;
|
||||
+ `&=`: Побитовый AND с присваиванием;
|
||||
|
@ -208,7 +208,7 @@ public static void main(String[] args) {}
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Где и для чего используется модификатор `abstract`?
|
||||
## Где и для чего используется модификатор `abstract`?
|
||||
Класс помеченный модификатором `abstract` называется абстрактным классом. Такие классы могут выступать только предками для других классов. Создавать экземпляры самого абстрактного класса не разрешается. При этом наследниками абстрактного класса могут быть как другие абстрактные классы, так и классы, допускающие создание объектов.
|
||||
|
||||
Метод помеченный ключевым словом `abstract` - абстрактный метод, т.е. метод, который не имеет реализации. Если в классе присутствует хотя бы один абстрактный метод, то весь класс должен быть объявлен абстрактным.
|
||||
|
@ -217,7 +217,7 @@ public static void main(String[] args) {}
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Дайте определение понятию _«интерфейс»_. Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
|
||||
## Дайте определение понятию _«интерфейс»_. Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
|
||||
Ключевое слово `interface` используется для создания полностью абстрактных классов. Основное предназначение интерфейса - определять каким образом мы можем использовать класс, который его реализует. Создатель интерфейса определяет имена методов, списки аргументов и типы возвращаемых значений, но не реализует их поведение. Все методы неявно объявляются как `public`.
|
||||
|
||||
Начиная с Java 8 в интерфейсах разрешается размещать реализацию методов по умолчанию `default` и статических `static` методов.
|
||||
|
@ -226,7 +226,7 @@ public static void main(String[] args) {}
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Чем абстрактный класс отличается от интерфейса? В каких случаях следует использовать абстрактный класс, а в каких интерфейс?
|
||||
## Чем абстрактный класс отличается от интерфейса? В каких случаях следует использовать абстрактный класс, а в каких интерфейс?
|
||||
+ В Java класс может одновременно реализовать несколько интерфейсов, но наследоваться только от одного класса.
|
||||
+ Абстрактные классы используются только тогда, когда присутствует тип отношений «is a» (является). Интерфейсы могут реализоваться классами, которые не связаны друг с другом.
|
||||
+ Абстрактный класс - средство, позволяющее избежать написания повторяющегося кода, инструмент для частичной реализации поведения. Интерфейс - это средство выражения семантики класса, контракт, описывающий возможности. Все методы интерфейса неявно объявляются как `public abstract` или (начиная с Java 8) `default` - методами с реализацией по-умолчанию, а поля - `public static final`.
|
||||
|
@ -237,22 +237,22 @@ public static void main(String[] args) {}
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Почему в некоторых интерфейсах вообще не определяют методов?
|
||||
## Почему в некоторых интерфейсах вообще не определяют методов?
|
||||
Это так называемые _маркерные интерфейсы_. Они просто указывают что класс относится к определенному типу. Примером может послужить интерфейс `Clonable`, который указывает на то, что класс поддерживает механизм клонирования.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Почему нельзя объявить метод интерфейса с модификатором `final`?
|
||||
## Почему нельзя объявить метод интерфейса с модификатором `final`?
|
||||
В случае интерфейсов указание модификатора `final` бессмысленно, т.к. все методы интерфейсов неявно объявляются как абстрактные, т.е. их невозможно выполнить, не реализовав где-то еще, а этого нельзя будет сделать, если у метода идентификатор `final`.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что имеет более высокий уровень абстракции - _класс_, _абстрактный класс_ или _интерфейс_?
|
||||
## Что имеет более высокий уровень абстракции - _класс_, _абстрактный класс_ или _интерфейс_?
|
||||
Интерфейс.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Может ли объект получить доступ к члену класса объявленному как `private`? Если да, то каким образом?
|
||||
## Может ли объект получить доступ к члену класса объявленному как `private`? Если да, то каким образом?
|
||||
+ Внутри класса доступ к приватной переменной открыт без ограничений;
|
||||
+ Вложенный класс имеет полный доступ ко всем (в том числе и приватным) членам содержащего его класса;
|
||||
+ Доступ к приватным переменным извне может быть организован через отличные от приватных методы, которые предоставлены разработчиком класса. Например: `getX()` и `setX()`.
|
||||
|
@ -272,7 +272,7 @@ int fieldValue = (int) field.get(victim);
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Каков порядок вызова конструкторов и блоков инициализации с учётом иерархии классов?
|
||||
## Каков порядок вызова конструкторов и блоков инициализации с учётом иерархии классов?
|
||||
Сначала вызываются все статические блоки в очередности от первого статического блока корневого предка и выше по цепочке иерархии до статических блоков самого класса.
|
||||
|
||||
Затем вызываются нестатические блоки инициализации корневого предка, конструктор корневого предка и так далее вплоть до нестатических блоков и конструктора самого класса.
|
||||
|
@ -287,7 +287,7 @@ int fieldValue = (int) field.get(victim);
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Зачем нужны и какие бывают блоки инициализации?
|
||||
## Зачем нужны и какие бывают блоки инициализации?
|
||||
Блоки инициализации представляют собой код, заключенный в фигурные скобки и размещаемый внутри класса вне объявления методов или конструкторов.
|
||||
|
||||
+ Существуют статические и нестатические блоки инициализации.
|
||||
|
@ -298,7 +298,7 @@ int fieldValue = (int) field.get(victim);
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##К каким конструкциям Java применим модификатор `static`?
|
||||
## К каким конструкциям Java применим модификатор `static`?
|
||||
+ полям;
|
||||
+ методам;
|
||||
+ вложенным классам;
|
||||
|
@ -306,19 +306,19 @@ int fieldValue = (int) field.get(victim);
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Для чего в Java используются статические блоки инициализации?
|
||||
## Для чего в Java используются статические блоки инициализации?
|
||||
Статические блоки инициализация используются для выполнения кода, который должен выполняться один раз при инициализации класса загрузчиком классов, в момент предшествующий созданию объектов этого класса при помощи конструктора. Такой блок (в отличие от нестатических, принадлежащих конкретном объекту класса) принадлежит только самому классу (объекту метакласса `Class`).
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что произойдёт, если в блоке инициализации возникнет исключительная ситуация?
|
||||
## Что произойдёт, если в блоке инициализации возникнет исключительная ситуация?
|
||||
Для нестатических блоков инициализации, если выбрасывание исключения прописано явным образом требуется требуется, чтобы объявления этих исключений были перечислены в `throws` всех конструкторов класса. Иначе будет ошибка компиляции. Для статического блока выбрасывание исключения в явном виде, приводит к ошибке компиляции.
|
||||
|
||||
В остальных случаях, взаимодействие с исключениями будет проходить так же как и в любом другом месте. Класс не будет инициализирован, если ошибка происходит в статическом блоке и объект класса не будет создан, если ошибка возникает в нестатическом блоке.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какое исключение выбрасывается при возникновении ошибки в блоке инициализации класса?
|
||||
## Какое исключение выбрасывается при возникновении ошибки в блоке инициализации класса?
|
||||
Если возникшее исключение - наследник `RuntimeException`:
|
||||
|
||||
+ для статических блоков инициализации будет выброшено `java.lang.ExceptionInInitializerError`;
|
||||
|
@ -328,7 +328,7 @@ int fieldValue = (int) field.get(victim);
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Может ли статический метод быть переопределён или перегружен?
|
||||
## Может ли статический метод быть переопределён или перегружен?
|
||||
Перегружен - да. Всё работает точно так же как и с обычными методами - 2 статических метода могут иметь одинаковое имя, если количество их параметров или типов различается.
|
||||
|
||||
Переопределён - нет. Выбор вызываемого статического метода происходит при раннем связывании (на этапе компиляции, а не выполнения) и выполняться всегда будет родительский метод, хотя синтаксически переопределение статического метода это вполне корректная языковая конструкция.
|
||||
|
@ -337,13 +337,13 @@ int fieldValue = (int) field.get(victim);
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Могут ли нестатические методы перегрузить статические?
|
||||
## Могут ли нестатические методы перегрузить статические?
|
||||
Да. В итоге получится два разных метода. Статический будет принадлежать классу и будет доступен через его имя, а нестатический будет принадлежать конкретному объекту и доступен через вызов метода этого объекта.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?
|
||||
##Возможно ли при переопределении метода изменить: модификатор доступа, возвращаемый тип, тип аргумента или их количество, имена аргументов или их порядок; убирать, добавлять, изменять порядок следования элементов секции `throws`?
|
||||
## Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?
|
||||
## Возможно ли при переопределении метода изменить: модификатор доступа, возвращаемый тип, тип аргумента или их количество, имена аргументов или их порядок; убирать, добавлять, изменять порядок следования элементов секции `throws`?
|
||||
При переопределении метода сужать модификатор доступа не разрешается, т.к. это приведёт к нарушению принципа подстановки Барбары Лисков. Расширение уровня доступа возможно.
|
||||
|
||||
Можно изменять все, что не мешает компилятору понять какой метод родительского класса имеется в виду:
|
||||
|
@ -354,7 +354,7 @@ int fieldValue = (int) field.get(victim);
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Как получить доступ к переопределенным методам родительского класса?
|
||||
## Как получить доступ к переопределенным методам родительского класса?
|
||||
С помощью ключевого слова `super` мы можем обратиться к любому члену родительского класса - методу или полю, если они не определены с модификатором `private`.
|
||||
|
||||
```java
|
||||
|
@ -363,12 +363,12 @@ super.method();
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Можно ли объявить метод абстрактным и статическим одновременно?
|
||||
## Можно ли объявить метод абстрактным и статическим одновременно?
|
||||
Нет. В таком случае компилятор выдаст ошибку: _"Illegal combination of modifiers: ‘abstract’ and ‘static’"_. Модификатор `abstract` говорит, что метод будет реализован в другом классе, а `static` наоборот указывает, что этот метод будет доступен по имени класса.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##В чем разница между членом экземпляра класса и статическим членом класса?
|
||||
## В чем разница между членом экземпляра класса и статическим членом класса?
|
||||
Модификатор `static` говорит о том, что данный метод или поле принадлежат самому классу и доступ к ним возможен даже без создания экземпляра класса. Поля помеченные `static` инициализируются при инициализации класса. На методы, объявленные как `static`, накладывается ряд ограничений:
|
||||
|
||||
+ Они могут вызывать только другие статические методы.
|
||||
|
@ -379,13 +379,13 @@ super.method();
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Где разрешена инициализация статических/нестатических полей?
|
||||
## Где разрешена инициализация статических/нестатических полей?
|
||||
+ Статические поля можно инициализировать при объявлении, в статическом или нестатическом блоке инициализации.
|
||||
+ Нестатические поля можно инициализировать при объявлении, в нестатическом блоке инициализации или в конструкторе.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какие типы классов бывают в java?
|
||||
## Какие типы классов бывают в java?
|
||||
+ _Top level class_ (Обычный класс):
|
||||
+ _Abstract class_ (Абстрактный класс);
|
||||
+ _Final class_ (Финализированный класс).
|
||||
|
@ -399,7 +399,7 @@ super.method();
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Расскажите про вложенные классы. В каких случаях они применяются?
|
||||
## Расскажите про вложенные классы. В каких случаях они применяются?
|
||||
Класс называется вложенным (_Nested class_), если он определен внутри другого класса. Вложенный класс должен создаваться только для того, чтобы обслуживать обрамляющий его класс. Если вложенный класс оказывается полезен в каком-либо ином контексте, он должен стать классом верхнего уровня. Вложенные классы имеют доступ ко всем (в том числе приватным) полям и методам внешнего класса, но не наоборот. Из-за этого разрешения использование вложенных классов приводит к некоторому нарушению инкапсуляции.
|
||||
|
||||
Существуют четыре категории вложенных классов:
|
||||
|
@ -414,12 +414,12 @@ super.method();
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что такое _«статический класс»_?
|
||||
## Что такое _«статический класс»_?
|
||||
Это вложенный класс, объявленный с использованием ключевого слова `static`. К классам вернего уровня модификатор `static` неприменим.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какие существуют особенности использования вложенных классов: статических и внутренних? В чем заключается разница между ними?
|
||||
## Какие существуют особенности использования вложенных классов: статических и внутренних? В чем заключается разница между ними?
|
||||
|
||||
+ Вложенные классы могут обращаться ко всем членам обрамляющего класса, в том числе и приватным.
|
||||
+ Для создания объекта статического вложенного класса объект внешнего класса не требуется.
|
||||
|
@ -429,7 +429,7 @@ super.method();
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что такое _«локальный класс»_? Каковы его особенности?
|
||||
## Что такое _«локальный класс»_? Каковы его особенности?
|
||||
__Local inner class__ (Локальный класс) - это вложенный класс, который может быть декларирован в любом блоке, в котором разрешается декларировать переменные. Как и простые внутренние классы (_Member inner class_) локальные классы имеют имена и могут использоваться многократно. Как и анонимные классы, они имеют окружающий их экземпляр только тогда, когда применяются в нестатическом контексте.
|
||||
|
||||
Локальные классы имеют следующие особенности:
|
||||
|
@ -442,7 +442,7 @@ __Local inner class__ (Локальный класс) - это вложенны
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что такое _«анонимные классы»_? Где они применяются?
|
||||
## Что такое _«анонимные классы»_? Где они применяются?
|
||||
Это вложенный локальный класс без имени, который разрешено декларировать в любом месте обрамляющего класса, разрешающем размещение выражений. Создание экземпляра анонимного класса происходит одновременно с его объявлением. В зависимости от местоположения анонимный класс ведет себя как статический либо как нестатический вложенный класс - в нестатическом контексте появляется окружающий его экземпляр.
|
||||
|
||||
Анонимные классы имеют несколько ограничений:
|
||||
|
@ -460,14 +460,14 @@ __Local inner class__ (Локальный класс) - это вложенны
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Каким образом из вложенного класса получить доступ к полю внешнего класса?
|
||||
## Каким образом из вложенного класса получить доступ к полю внешнего класса?
|
||||
Статический вложенный класс имеет прямой доступ только к статическим полям обрамляющего класса.
|
||||
|
||||
Простой внутренний класс, может обратиться к любому полю внешнего класса напрямую. В случае, если у вложенного класса уже существует поле с таким же литералом, то обращаться к такому полю следует через ссылку на его экземляр. Например: `Outer.this.field`.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Для чего используется оператор `assert`?
|
||||
## Для чего используется оператор `assert`?
|
||||
__Assert__ (Утверждение) — это специальная конструкция, позволяющая проверять предположения о значениях произвольных данных в произвольном месте программы. Утверждение может автоматически сигнализировать об обнаружении некорректных данных, что обычно приводит к аварийному завершению программы с указанием места обнаружения некорректных данных.
|
||||
|
||||
Утверждения существенно упрощают локализацию ошибок в коде. Даже проверка результатов выполнения очевидного кода может оказаться полезной при последующем рефакторинге, после которого код может стать не настолько очевидным и в него может закрасться ошибка.
|
||||
|
@ -484,7 +484,7 @@ __Assert__ (Утверждение) — это специальная конст
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что такое _Heap_ и _Stack_ память в Java? Какая разница между ними?
|
||||
## Что такое _Heap_ и _Stack_ память в Java? Какая разница между ними?
|
||||
__Heap (куча)__ используется Java Runtime для выделения памяти под объекты и классы. Создание нового объекта также происходит в куче. Это же является областью работы сборщика мусора. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться из любой части приложения.
|
||||
|
||||
__Stack (стек)__ это область хранения данных также находящееся в общей оперативной памяти (_RAM_). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода.
|
||||
|
@ -503,17 +503,17 @@ __Stack (стек)__ это область хранения данных так
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Верно ли утверждение, что примитивные типы данных всегда хранятся в стеке, а экземпляры ссылочных типов данных в куче?
|
||||
## Верно ли утверждение, что примитивные типы данных всегда хранятся в стеке, а экземпляры ссылочных типов данных в куче?
|
||||
Не совсем. Примитивное поле экземпляра класса хранится не в стеке, а в куче. Любой объект (всё, что явно или неявно создаётся при помощи оператора `new`) хранится в куче.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Каким образом передаются переменные в методы, по значению или по ссылке?
|
||||
## Каким образом передаются переменные в методы, по значению или по ссылке?
|
||||
В Java параметры всегда передаются только по значению, что определяется как «скопировать значение и передать копию». С примитивами это будет копия содержимого. Со ссылками - тоже копия содержимого, т.е. копия ссылки. При этом внутренние члены ссылочных типов через такую копию изменить возможно, а вот саму ссылку, указывающую на экземпляр - нет.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Для чего нужен сборщик мусора?
|
||||
## Для чего нужен сборщик мусора?
|
||||
Сборщик мусора (Garbage Collector) должен делать всего две вещи:
|
||||
|
||||
+ Находить мусор - неиспользуемые объекты. (Объект считается неиспользуемым, если ни одна из сущностей в коде, выполняемом в данный момент, не содержит ссылок на него, либо цепочка ссылок, которая могла бы связать объект с некоторой сущностью приложения, обрывается);
|
||||
|
@ -583,7 +583,7 @@ __Reference counting__ (подсчёт ссылок). Суть этого под
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Как работает сборщик мусора?
|
||||
## Как работает сборщик мусора?
|
||||
Механизм сборки мусора - это процесс освобождения места в куче, для возможности добавления новых объектов.
|
||||
|
||||
Объекты создаются посредством оператора `new`, тем самым присваивая объекту ссылку. Для окончания работы с объектом достаточно просто перестать на него ссылаться, например присвоив переменной ссылку на другой объект или значение `null`; прекратить выполнение метода, чтобы его локальные переменные завершили свое существование естественным образом. Объекты, ссылки на которые отсутствуют, принято называть мусором (_garbage_), который будет удален.
|
||||
|
@ -596,7 +596,7 @@ __Reference counting__ (подсчёт ссылок). Суть этого под
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какие разновидности сборщиков мусора реализованы в виртуальной машине HotSpot?
|
||||
## Какие разновидности сборщиков мусора реализованы в виртуальной машине HotSpot?
|
||||
Java HotSpot VM предоставляет разработчикам на выбор четыре различных сборщика мусора:
|
||||
|
||||
+ __Serial (последовательный)__ — самый простой вариант для приложений с небольшим объемом данных и не требовательных к задержкам. На данный момент используется сравнительно редко, но на слабых компьютерах может быть выбран виртуальной машиной в качестве сборщика по умолчанию. Использование Serial GC включается опцией `-XX:+UseSerialGC`.
|
||||
|
@ -606,7 +606,7 @@ Java HotSpot VM предоставляет разработчикам на вы
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Опишите алгоритм работы какого-нибудь сборщика мусора реализованного в виртуальной машине HotSpot.
|
||||
## Опишите алгоритм работы какого-нибудь сборщика мусора реализованного в виртуальной машине HotSpot.
|
||||
__Serial Garbage Collector (Последовательный сборщик мусора)__ был одним из первых сборщиков мусора в HotSpot VM. Во время работы этого сборщика приложения приостанавливается и продолжает работать только после прекращение сборки мусора.
|
||||
|
||||
Память приложения делится на три пространства:
|
||||
|
@ -633,7 +633,7 @@ __Serial Garbage Collector (Последовательный сборщик му
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что такое «пул строк»?
|
||||
## Что такое «пул строк»?
|
||||
__Пул строк__ – это набор строк хранящийся в _Heap_.
|
||||
|
||||
+ Пул строк возможен благодаря неизменяемости строк в Java и реализации идеи интернирования строк;
|
||||
|
@ -644,7 +644,7 @@ __Пул строк__ – это набор строк хранящийся в _
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что такое `finalize()`? Зачем он нужен?
|
||||
## Что такое `finalize()`? Зачем он нужен?
|
||||
Через вызов метода `finalize()` JVM реализуется функциональность аналогичная функциональности деструкторов в С++, используемых для очистки памяти перед возвращением управления операционной системе. Данный метод вызывается при уничтожении объекта сборщиком мусора (_garbage collector_) и переопределяя `finalize()` можно запрограммировать действия необходимые для корректного удаления экземпляра класса - например, закрытие сетевых соединений, соединений с базой данных, снятие блокировок на файлы и т.д.
|
||||
|
||||
После выполнения этого метода объект должен быть повторно собран сборщиком мусора (и это считается серьезной проблемой метода `finalize()` т.к. он мешает сборщику мусора освобождать память). Вызов этого метода не гарантируется, т.к. приложение может быть завершено до того, как будет запущена сборка мусора.
|
||||
|
@ -653,14 +653,14 @@ __Пул строк__ – это набор строк хранящийся в _
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что произойдет со сборщиком мусора, если выполнение метода `finalize()` требует ощутимо много времени, или в процессе выполнения будет выброшено исключение?
|
||||
## Что произойдет со сборщиком мусора, если выполнение метода `finalize()` требует ощутимо много времени, или в процессе выполнения будет выброшено исключение?
|
||||
Непосредственно вызов `finalize()` происходит в отдельном потоке _Finalizer_ (`java.lang.ref.Finalizer.FinalizerThread`), который создаётся при запуске виртуальной машины (в статической секции при загрузке класса `Finalizer`). Методы `finalize()` вызываются последовательно в том порядке, в котором были добавлены в список сборщиком мусора. Соответственно, если какой-то `finalize()` зависнет, он подвесит поток _Finalizer_, но не сборщик мусора. Это в частности означает, что объекты, не имеющие метода `finalize()`, будут исправно удаляться, а вот имеющие будут добавляться в очередь, пока поток _Finalizer_ не освободится, не завершится приложение или не кончится память.
|
||||
|
||||
То же самое применимо и выброшенным в процессе `finalize()` исключениям: метод `runFinalizer()` у потока _Finalizer_ игнорирует все исключения выброшенные в момент выполнения `finalize()`. Таким образом возникновение исключительной ситуации никак не скажется на работоспособности сборщика мусора.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Чем отличаются `final`, `finally` и `finalize()`?
|
||||
## Чем отличаются `final`, `finally` и `finalize()`?
|
||||
Модификатор `final`:
|
||||
|
||||
+ Класс не может иметь наследников;
|
||||
|
@ -675,7 +675,7 @@ __Пул строк__ – это набор строк хранящийся в _
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Расскажите про приведение типов. Что такое понижение и повышение типа?
|
||||
## Расскажите про приведение типов. Что такое понижение и повышение типа?
|
||||
Java является строго типизированным языком программирования, а это означает, то что каждое выражение и каждая переменная имеет строго определенный тип уже на момент компиляции. Однако определен механизм _приведения типов (casting)_ - способ преобразования значения переменной одного типа в значение другого типа.
|
||||
|
||||
В Java существуют несколько разновидностей приведения:
|
||||
|
@ -701,12 +701,12 @@ if (parent instanceof Child) {
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Когда в приложении может быть выброшено исключение `ClassCastException`?
|
||||
## Когда в приложении может быть выброшено исключение `ClassCastException`?
|
||||
`ClassCastException` (потомок `RuntimeException`) - исключение, которое будет выброшено при ошибке приведения типа.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что такое _autoboxing («автоупаковка»)_ в Java и каковы правила упаковки примитивных типов в классы-обертки?
|
||||
## Что такое _autoboxing («автоупаковка»)_ в Java и каковы правила упаковки примитивных типов в классы-обертки?
|
||||
__Автоупаковка__ - это механизм неявной инициализации объектов классов-оберток (`Byte`, `Short`, `Integer`, `Long`, `Float`, `Double`, `Character`, `Boolean`) значениями соответствующих им исходных примитивных типов (`byte`, `short`, `int`...), без явного использования конструктора класса.
|
||||
|
||||
+ Автоупаковка происходит при прямом присваивании примитива классу-обертке (с помощью оператора `=`), либо при передаче примитива в параметры метода (типа класса-обертки).
|
||||
|
@ -725,7 +725,7 @@ __Автоупаковка__ - это механизм неявной иници
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какие есть особенности класса `String`?
|
||||
## Какие есть особенности класса `String`?
|
||||
+ Это неизменяемый (immutable) и финализированный тип данных;
|
||||
+ Все объекты класса `String` JVM хранит в пуле строк;
|
||||
+ Объект класса `String` можно получить используя двойные кавычки;
|
||||
|
@ -734,7 +734,7 @@ __Автоупаковка__ - это механизм неявной иници
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Почему `String` неизменяемый и финализированный класс?
|
||||
## Почему `String` неизменяемый и финализированный класс?
|
||||
Есть несколько преимуществ в неизменности строк:
|
||||
|
||||
+ Пул строк возможен только потому, что строка неизменяемая, таким образом виртуальная машина сохраняет больше свободного места в _Heap_, поскольку разные строковые переменные указывают на одну и ту же переменную в пуле. Если бы строка была изменяемой, то интернирование строк не было бы возможным, потому что изменение значения одной переменной отразилось бы также и на остальных переменных, ссылающихся на эту строку.
|
||||
|
@ -745,23 +745,23 @@ __Автоупаковка__ - это механизм неявной иници
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Почему `char[]` предпочтительнее `String` для хранения пароля?
|
||||
## Почему `char[]` предпочтительнее `String` для хранения пароля?
|
||||
С момента создания строка остаётся в пуле, до тех пор пока не будет удалена сборщиком мусора. Поэтому, даже после окончания использования пароля, он некоторое время продолжает оставаться доступным в памяти и способа избежать этого не существует. Это представляет определённый риск для безопасности, поскольку кто-либо, имеющий доступ к памяти сможет найти пароль в виде текста.
|
||||
В случае использования массива символов для хранения пароля имеется возможность очистить его сразу по окончанию работы с паролем, позволяя избежать риска безопасности, свойственного строке.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Почему строка является популярным ключом в `HashMap` в Java?
|
||||
## Почему строка является популярным ключом в `HashMap` в Java?
|
||||
Поскольку строки неизменяемы, их хэш код вычисляется и кэшируется в момент создания, не требуя повторного пересчета при дальнейшем использовании. Поэтому в качестве ключа `HashMap` они будут обрабатываться быстрее.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что делает метод `intern()` в классе `String`?.
|
||||
## Что делает метод `intern()` в классе `String`?.
|
||||
Метод `intern()` используется для сохранения строки в пуле строк или получения ссылки, если такая строка уже находится в пуле.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Можно ли мы использовать строки в конструкции `switch`?
|
||||
## Можно ли мы использовать строки в конструкции `switch`?
|
||||
Да, начиная с Java 7 в операторе `switch` можно использовать строки, ранние версии Java не поддерживают этого. При этом:
|
||||
|
||||
+ участвующие строки чувствительны к регистру;
|
||||
|
@ -770,7 +770,7 @@ __Автоупаковка__ - это механизм неявной иници
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какая основная разница между `String`, `StringBuffer`, `StringBuilder`?
|
||||
## Какая основная разница между `String`, `StringBuffer`, `StringBuilder`?
|
||||
Класс `String` является неизменяемым (_immutable_) - модифицировать объект такого класса нельзя, можно лишь заменить его созданием нового экземпляра.
|
||||
|
||||
Класс `StringBuffer` изменяемый - использовать `StringBuffer` следует тогда, когда необходимо часто модифицировать содержимое.
|
||||
|
@ -780,7 +780,7 @@ __Автоупаковка__ - это механизм неявной иници
|
|||
[к оглавлению](#java-core)
|
||||
|
||||
|
||||
##Что такое класс `Object`? Какие в нем есть методы?
|
||||
## Что такое класс `Object`? Какие в нем есть методы?
|
||||
`Object` это базовый класс для всех остальных объектов в Java. Любой класс наследуется от `Object` и, соответственно, наследуют его методы:
|
||||
|
||||
`public boolean equals(Object obj)` – служит для сравнения объектов по значению;
|
||||
|
@ -797,12 +797,12 @@ __Автоупаковка__ - это механизм неявной иници
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Дайте определение понятию «конструктор».
|
||||
## Дайте определение понятию «конструктор».
|
||||
__Конструктор__ — это специальный метод у которого отсутствует возвращаемый тип и который имеет то же имя, что и класс, в котором он используется. Конструктор вызывается при создании нового объекта класса и определяет действия необходимые для его инициализации.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что такое _«конструктор по умолчанию»_?
|
||||
## Что такое _«конструктор по умолчанию»_?
|
||||
Если у какого-либо класса не определить конструктор, то компилятор сгенерирует конструктор без аргументов - так называемый __«конструктор по умолчанию»__.
|
||||
|
||||
```java
|
||||
|
@ -813,18 +813,18 @@ public class ClassName() {}
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Чем отличаются конструктор по-умолчанию, конструктор копирования и конструктор с параметрами?
|
||||
## Чем отличаются конструктор по-умолчанию, конструктор копирования и конструктор с параметрами?
|
||||
|
||||
У конструктора по умолчанию отсутствуют какие-либо аргументы. Конструктор копирования принимает в качестве аргумента уже существующий объект класса для последующего создания его клона. Конструктор с параметрами имеет в своей сигнатуре аргументы (обычно необходимые для инициализации полей класса).
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Где и как вы можете использовать приватный конструктор?
|
||||
## Где и как вы можете использовать приватный конструктор?
|
||||
Приватный (помеченный ключевым словом `private`, скрытый) конструктор может использоваться публичным статическим методом генерации объектов данного класса. Также доступ к нему разрешён вложенным классам и может использоваться для их нужд.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Расскажите про классы-загрузчики и про динамическую загрузку классов.
|
||||
## Расскажите про классы-загрузчики и про динамическую загрузку классов.
|
||||
Основа работы с классами в Java — классы-загрузчики, обычные Java-объекты, предоставляющие интерфейс для поиска и создания объекта класса по его имени во время работы приложения.
|
||||
|
||||
В начале работы программы создается 3 основных загрузчика классов:
|
||||
|
@ -858,7 +858,7 @@ public class ClassName() {}
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что такое _Reflection_?
|
||||
## Что такое _Reflection_?
|
||||
__Рефлексия (Reflection)__ - это механизм получения данных о программе во время её выполнения (runtime). В Java _Reflection_ осуществляется с помощью _Java Reflection API_, состоящего из классов пакетов `java.lang` и `java.lang.reflect`.
|
||||
|
||||
Возможности Java Reflection API:
|
||||
|
@ -873,15 +873,15 @@ __Рефлексия (Reflection)__ - это механизм получения
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Зачем нужен `equals()`. Чем он отличается от операции `==`?
|
||||
## Зачем нужен `equals()`. Чем он отличается от операции `==`?
|
||||
Метод `equals()` - определяет отношение эквивалентности объектов.
|
||||
|
||||
При сравнение объектов с помощью `==` сравнение происходит лишь между ссылками. При сравнении по переопределённому разработчиком `equals()` - по внутреннему состоянию объектов.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Если вы хотите переопределить `equals()`, какие условия должны выполняться?
|
||||
##Какими свойствами обладает порождаемое `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`;
|
||||
|
@ -891,7 +891,7 @@ __Рефлексия (Reflection)__ - это механизм получения
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Правила переопределения метода `Object.equals()`.
|
||||
## Правила переопределения метода `Object.equals()`.
|
||||
1. Использование оператора `==` для проверки, является ли аргумент ссылкой на указанный объект. Если является, возвращается `true`. Если сравниваемый объект `== null`, должно вернуться `false`.
|
||||
2. Использование оператор `instanceof` и вызова метода `getClass()` для проверки, имеет ли аргумент правильный тип. Если не имеет, возвращается `false`.
|
||||
3. Приведение аргумента к правильному типу. Поскольку эта операция следует за проверкой `instanceof` она гарантированно будет выполнена.
|
||||
|
@ -901,18 +901,18 @@ __Рефлексия (Reflection)__ - это механизм получения
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какая связь между `hashCode()` и `equals()`?
|
||||
##Если `equals()` переопределен, есть ли какие-либо другие методы, которые следует переопределить?
|
||||
## Какая связь между `hashCode()` и `equals()`?
|
||||
## Если `equals()` переопределен, есть ли какие-либо другие методы, которые следует переопределить?
|
||||
Равные объекты должны возвращать одинаковые хэш коды. При переопределении `equals()` нужно обязательно переопределять и метод `hashCode()`.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что будет, если переопределить `equals()` не переопределяя `hashCode()`? Какие могут возникнуть проблемы?
|
||||
## Что будет, если переопределить `equals()` не переопределяя `hashCode()`? Какие могут возникнуть проблемы?
|
||||
Классы и методы, которые используют правила этого контракта могут работать некорректно. Так для `HashMap` это может привести к тому, что пара «ключ-значение», которая была в неё помещена при использовании нового экземпляра ключа не будет в ней найдена.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Каким образом реализованы методы `hashCode()` и `equals()` в классе `Object`?
|
||||
## Каким образом реализованы методы `hashCode()` и `equals()` в классе `Object`?
|
||||
Реализация метода `Object.equals()` сводится к проверке на равенство двух ссылок:
|
||||
|
||||
```java
|
||||
|
@ -929,7 +929,7 @@ public native int hashCode();
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Для чего нужен метод `hashCode()`?
|
||||
## Для чего нужен метод `hashCode()`?
|
||||
Метод `hashCode()` необходим для вычисления хэш кода переданного в качестве входного параметра объекта. В Java это целое число, в более широком смыле - битовая строка фиксированной длины, полученная из массива произвольной длины. Этот метод реализован таким образом, что для одного и того же входного объекта, хэш код всегда будет одинаковым. Следует понимать, что в Java множество возможных хэш кодов ограничено типом `int`, а множество объектов ничем не ограничено. Из-за этого, вполне возможна ситуация, что хэш коды разных объектов могут совпасть:
|
||||
|
||||
+ если хэш коды разные, то и объекты гарантированно разные;
|
||||
|
@ -937,59 +937,59 @@ public native int hashCode();
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Каковы правила переопределения метода `Object.hashCode()`?
|
||||
##Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете `hashCode()`?
|
||||
## Каковы правила переопределения метода `Object.hashCode()`?
|
||||
## Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете `hashCode()`?
|
||||
Общий совет: выбирать поля, которые с большой долью вероятности будут различаться. Для этого необходимо использовать уникальные, лучше всего примитивные поля, например такие как `id`, `uuid`. При этом нужно следовать правилу, если поля задействованы при вычислении `hashCode()`, то они должны быть задействованы и при выполнении `equals()`.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Могут ли у разных объектов быть одинаковые `hashCode()`?
|
||||
## Могут ли у разных объектов быть одинаковые `hashCode()`?
|
||||
Да, могут. Метод `hashCode()` не гарантирует уникальность возвращаемого значения. Ситуация, когда у разных объектов одинаковые хэш коды называется _коллизией_. Вероятность возникновения коллизии зависит от используемого алгоритма генерации хэш кода.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Если у класса `Point{int x, y;}` реализовать метод `equals(Object that) {(return this.x == that.x && this.y == that.y)}`, но сделать хэш код в виде `int hashCode() {return x;}`, то будут ли корректно такие точки помещаться и извлекаться из `HashSet`?
|
||||
## Если у класса `Point{int x, y;}` реализовать метод `equals(Object that) {(return this.x == that.x && this.y == that.y)}`, но сделать хэш код в виде `int hashCode() {return x;}`, то будут ли корректно такие точки помещаться и извлекаться из `HashSet`?
|
||||
`HashSet` использует `HashMap` для хранения элементов. При добавлении элемента в `HashMap` вычисляется хэш код, по которому определяется позиция в массиве, куда будет вставлен новый элемент. У всех экземпляров класса `Point` хэш код будет одинаковым для всех объектов с одинаковым `x`, что приведёт к вырождению хэш таблицы в список.
|
||||
|
||||
При возникновении коллизии в `HashMap` осуществляется проверка на наличие элемента в списке: `e.hash == hash && ((k = e.key) == key || key.equals(k))`. Если элемент найден, то его значение перезаписывается. В нашем случае для разных объектов метод `equals()` будет возвращать `false`. Соответственно новый элемент будет успешно добавлен в `HashSet`. Извлечение элемента также будет осуществляться успешно. Но производительность такого кода будет невысокой и преимущества хэш таблиц использоваться не будут.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Могут ли у разных объектов `(ref0 != ref1)` быть `ref0.equals(ref1) == true`?
|
||||
## Могут ли у разных объектов `(ref0 != ref1)` быть `ref0.equals(ref1) == true`?
|
||||
Да, могут. Для этого в классе этих объектов должен быть переопределен метод `equals()`.
|
||||
|
||||
Если используется метод `Object.equals()`, то для двух ссылок `x` и `y` метод вернет `true` тогда и только тогда, когда обе ссылки указывают на один и тот же объект (т.е. `x == y` возвращает `true`).
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Могут ли у разных ссылок на один объект `(ref0 == ref1)` быть `ref0.equals(ref1) == false`?
|
||||
## Могут ли у разных ссылок на один объект `(ref0 == ref1)` быть `ref0.equals(ref1) == false`?
|
||||
В общем случае - могут, если метод `equals()` реализован некорректно и не выполняет свойство рефлексивности: для любых ненулевых ссылок `x` метод `x.equals(x)` должен возвращать `true`.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Можно ли так реализовать метод `equals(Object that) {return this.hashCode() == that.hashCode()}`?
|
||||
## Можно ли так реализовать метод `equals(Object that) {return this.hashCode() == that.hashCode()}`?
|
||||
Строго говоря нельзя, поскольку метод `hashCode()` не гарантирует уникальность значения для каждого объекта. Однако для сравнения экземпляров класса `Object` такой код допустим, т.к. метод `hashCode()` в классе `Object` возвращает уникальные значения для разных объектов (его вычисление основано на использовании адреса объекта в памяти).
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##В `equals()` требуется проверять, что аргумент `equals(Object that)` такого же типа что и сам объект. В чем разница между `this.getClass() == that.getClass()` и `that instanceof MyClass`?
|
||||
## В `equals()` требуется проверять, что аргумент `equals(Object that)` такого же типа что и сам объект. В чем разница между `this.getClass() == that.getClass()` и `that instanceof MyClass`?
|
||||
Оператор `instanceof` сравнивает объект и указанный тип. Его можно использовать для проверки является ли данный объект экземпляром некоторого класса, либо экземпляром его дочернего класса, либо экземпляром класса, который реализует указанный интерфейс.
|
||||
|
||||
`this.getClass() == that.getClass()` проверяет два класса на идентичность, поэтому для корректной реализации контракта метода `equals()` необходимо использовать точное сравнение с помощью метода `getClass()`.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Можно ли реализовать метод `equals()` класса `MyClass` вот так: `class MyClass {public boolean equals(MyClass that) {return this == that;}}`?
|
||||
## Можно ли реализовать метод `equals()` класса `MyClass` вот так: `class MyClass {public boolean equals(MyClass that) {return this == that;}}`?
|
||||
Реализовать можно, но данный метод не переопределяет метод `equals()` класса `Object`, а перегружает его.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Есть класс `Point{int x, y;}`. Почему хэш код в виде `31 * x + y` предпочтительнее чем `x + y`?
|
||||
## Есть класс `Point{int x, y;}`. Почему хэш код в виде `31 * x + y` предпочтительнее чем `x + y`?
|
||||
Множитель создает зависимость значения хэш кода от очередности обработки полей, что в итоге порождает лучшую хэш функцию.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Расскажите про клонирование объектов.
|
||||
## Расскажите про клонирование объектов.
|
||||
Использование оператора присваивания не создает нового объекта, а лишь копирует ссылку на объект. Таким образом, две ссылки указывают на одну и ту же область памяти, на один и тот же объект. Для создания нового объекта с таким же состоянием используется клонирование объекта.
|
||||
|
||||
Класс `Object` содержит `protected` метод `clone()`, осуществляющий побитовое копирование объекта производного класса. Однако сначала необходимо переопределить метод `clone()` как `public` для обеспечения возможности его вызова. В переопределенном методе следует вызвать базовую версию метода `super.clone()`, которая и выполняет собственно клонирование.
|
||||
|
@ -1008,7 +1008,7 @@ public native int hashCode();
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##В чем отличие между _поверхностным_ и _глубоким_ клонированием?
|
||||
## В чем отличие между _поверхностным_ и _глубоким_ клонированием?
|
||||
__Поверхностное копирование__ копирует настолько малую часть информации об объекте, насколько это возможно. По умолчанию, клонирование в Java является поверхностным, т.е. класс `Object` не знает о структуре класса, которого он копирует. Клонирование такого типа осуществляется JVM по следующим правилам:
|
||||
|
||||
+ Если класс имеет только члены примитивных типов, то будет создана совершенно новая копия объекта и возвращена ссылка на этот объект.
|
||||
|
@ -1021,7 +1021,7 @@ __Глубокое копирование__ дублирует абсолютн
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какой способ клонирования предпочтительней?
|
||||
## Какой способ клонирования предпочтительней?
|
||||
Наиболее безопасным и следовательно предпочтительным способом клонирования является использование специализированного конструктора копирования:
|
||||
|
||||
+ Отсутствие ошибок наследования (не нужно беспокоиться, что у наследников появятся новые поля, которые не будут склонированы через метод `clone()`);
|
||||
|
@ -1030,12 +1030,12 @@ __Глубокое копирование__ дублирует абсолютн
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Почему метод `clone()` объявлен в классе `Object`, а не в интерфейсе `Cloneable`?
|
||||
## Почему метод `clone()` объявлен в классе `Object`, а не в интерфейсе `Cloneable`?
|
||||
Метод `clone()` объявлен в классе `Object` с указанием модификатора `native`, чтобы обеспечить доступ к стандартному механизму поверхностного копирования объектов. Одновременно он объявлен и как `protected`, чтобы нельзя было вызвать этот метод у не переопределивших его объектов. Непосредственно интерфейс `Cloneable` является маркерным (не содержит объявлений методов) и нужен только для обозначения самого факта, что данный объект готов к тому, чтобы быть клонированным. Вызов переопределённого метода `clone()` у не `Cloneable` объекта вызовет выбрасывание `CloneNotSupportedException`.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Опишите иерархию исключений.
|
||||
## Опишите иерархию исключений.
|
||||
Исключения делятся на несколько классов, но все они имеют общего предка — класс `Throwable`, потомками которого являются классы `Exception` и `Error`.
|
||||
|
||||
__Ошибки (Errors)__ представляют собой более серьёзные проблемы, которые, согласно спецификации Java, не следует обрабатывать в собственной программе, поскольку они связаны с проблемами уровня JVM. Например, исключения такого рода возникают, если закончилась память доступная виртуальной машине.
|
||||
|
@ -1044,8 +1044,8 @@ __Исключения (Exceptions)__ являются результатом п
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какие виды исключений в Java вы знаете, чем они отличаются?
|
||||
##Что такое _checked_ и _unchecked exception_?
|
||||
## Какие виды исключений в Java вы знаете, чем они отличаются?
|
||||
## Что такое _checked_ и _unchecked exception_?
|
||||
В Java все исключения делятся на два типа:
|
||||
|
||||
+ __checked (контролируемые/проверяемые исключения)__ должны обрабатываться блоком `catch` или описываться в сигнатуре метода (например `IOException`). Наличие такого обработчика/модификатора сигнатуры проверяются на этапе компиляции;
|
||||
|
@ -1053,7 +1053,7 @@ __Исключения (Exceptions)__ являются результатом п
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какой оператор позволяет принудительно выбросить исключение?
|
||||
## Какой оператор позволяет принудительно выбросить исключение?
|
||||
Это оператор `throw`:
|
||||
|
||||
```java
|
||||
|
@ -1062,12 +1062,12 @@ throw new Exception();
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##О чем говорит ключевое слово `throws`?
|
||||
## О чем говорит ключевое слово `throws`?
|
||||
Модификатор `throws` прописывается в сигнатуре метода и указывает на то, что метод потенциально может выбросить исключение с указанным типом.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Как написать собственное («пользовательское») исключение?
|
||||
## Как написать собственное («пользовательское») исключение?
|
||||
Необходимо унаследоваться от базового класса требуемого типа исключений (например от `Exception` или `RuntimeException`).
|
||||
|
||||
```java
|
||||
|
@ -1088,17 +1088,17 @@ class CustomException extends Exception {
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Какие существуют _unchecked exception_?
|
||||
## Какие существуют _unchecked exception_?
|
||||
Наиболее часто встречающиеся: `ArithmeticException`, `ClassCastException`, `ConcurrentModificationException`, `IllegalArgumentException`, `IllegalStateException`, `IndexOutOfBoundsException`, `NoSuchElementException`, `NullPointerException`, `UnsupportedOperationException`.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что представляет из себя ошибки класса `Error`?
|
||||
## Что представляет из себя ошибки класса `Error`?
|
||||
Ошибки класса `Error` представляют собой наиболее серьёзные проблемы уровня JVM. Например, исключения такого рода возникают, если закончилась память доступная виртуальной машине. Обрабатывать такие ошибки не запрещается, но делать этого не рекомендуется.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что вы знаете о `OutOfMemoryError`?
|
||||
## Что вы знаете о `OutOfMemoryError`?
|
||||
`OutOfMemoryError` выбрасывается, когда виртуальная машина Java не может создать (разместить) объект из-за нехватки памяти, а сборщик мусора не может высвободить достаточное её количество.
|
||||
|
||||
Область памяти, занимаемая java процессом, состоит из нескольких частей. Тип `OutOfMemoryError` зависит от того, в какой из них не хватило места:
|
||||
|
@ -1110,7 +1110,7 @@ class CustomException extends Exception {
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Опишите работу блока _try-catch-finally_.
|
||||
## Опишите работу блока _try-catch-finally_.
|
||||
`try` — данное ключевое слово используется для отметки начала блока кода, который потенциально может привести к ошибке.
|
||||
`catch` — ключевое слово для отметки начала блока кода, предназначенного для перехвата и обработки исключений в случае их возникновения.
|
||||
`finally` — ключевое слово для отметки начала блока кода, который является дополнительным. Этот блок помещается после последнего блока `catch`. Управление передаётся в блок `finally` в любом случае, было выброшено исключение или нет.
|
||||
|
@ -1131,7 +1131,7 @@ finally {
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что такое механизм _try-with-resources_?
|
||||
## Что такое механизм _try-with-resources_?
|
||||
Данная конструкция, которая появилась в Java 7, позволяет использовать блок _try-catch_ не заботясь о закрытии ресурсов, используемых в данном сегменте кода.
|
||||
Ресурсы объявляются в скобках сразу после `try`, а компилятор уже сам неявно создаёт секцию `finally`, в которой и происходит освобождение занятых в блоке ресурсов. Под ресурсами подразумеваются сущности, реализующие интерфейс `java.lang.Autocloseable`.
|
||||
|
||||
|
@ -1151,12 +1151,12 @@ try(/*объявление ресурсов*/) {
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Возможно ли использование блока _try-finally_ (без `catch`)?
|
||||
## Возможно ли использование блока _try-finally_ (без `catch`)?
|
||||
Такая запись допустима, но смысла в такой записи не так много, всё же лучше иметь блок `catch`, в котором будет обрабатываться необходимое исключение.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Может ли один блок `catch` отлавливать сразу несколько исключений?
|
||||
## Может ли один блок `catch` отлавливать сразу несколько исключений?
|
||||
В Java 7 стала доступна новая языковая конструкция, с помощью которой можно перехватывать несколько исключений одним блоком `catch`:
|
||||
|
||||
```java
|
||||
|
@ -1169,12 +1169,12 @@ try {
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Всегда ли исполняется блок `finally`?
|
||||
## Всегда ли исполняется блок `finally`?
|
||||
Код в блоке `finally` будет выполнен всегда, независимо от того, выброшено исключение или нет.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Существуют ли ситуации, когда блок `finally` не будет выполнен?
|
||||
## Существуют ли ситуации, когда блок `finally` не будет выполнен?
|
||||
Например, когда JVM «умирает» - в такой ситуации `finally` недостижим и не будет выполнен, так как происходит принудительный системный выход из программы:
|
||||
|
||||
```java
|
||||
|
@ -1187,12 +1187,12 @@ try {
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Может ли метод _main()_ выбросить исключение во вне и если да, то где будет происходить обработка данного исключения?
|
||||
## Может ли метод _main()_ выбросить исключение во вне и если да, то где будет происходить обработка данного исключения?
|
||||
Может и оно будет передано в виртуальную машину Java (JVM).
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Предположим, есть метод, который может выбросить `IOException` и `FileNotFoundException` в какой последовательности должны идти блоки `catch`? Сколько блоков `catch` будет выполнено?
|
||||
## Предположим, есть метод, который может выбросить `IOException` и `FileNotFoundException` в какой последовательности должны идти блоки `catch`? Сколько блоков `catch` будет выполнено?
|
||||
Общее правило: обрабатывать исключения нужно от «младшего» к старшему. Т.е. нельзя поставить в первый блок `catch(Exception ex) {}`, иначе все дальнейшие блоки `catch()` уже ничего не смогут обработать, т.к. любое исключение будет соответствовать обработчику `catch(Exception ex)`.
|
||||
|
||||
Таким образом, исходя из факта, что `FileNotFoundException extends IOException` сначала нужно обработать `FileNotFoundException`, а затем уже `IOException`:
|
||||
|
@ -1211,14 +1211,14 @@ void method() {
|
|||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что такое _generics_?
|
||||
## Что такое _generics_?
|
||||
__Generics__ - это технический термин, обозначающий набор свойств языка позволяющих определять и использовать обобщенные типы и методы. Обобщенные типы или методы отличаются от обычных тем, что имеют типизированные параметры.
|
||||
|
||||
Примером использования обобщенных типов может служить _Java Collection Framework_. Так, класс `LinkedList<E>` - типичный обобщенный тип. Он содержит параметр `E`, который представляет тип элементов, которые будут храниться в коллекции. Создание объектов обобщенных типов происходит посредством замены параметризированных типов реальными типами данных. Вместо того, чтобы просто использовать `LinkedList`, ничего не говоря о типе элемента в списке, предлагается использовать точное указание типа `LinkedList<String>`, `LinkedList<Integer>` и т.п.
|
||||
|
||||
[к оглавлению](#java-core)
|
||||
|
||||
##Что такое _«интернационализация»_, _«локализация»_?
|
||||
## Что такое _«интернационализация»_, _«локализация»_?
|
||||
__Интернационализация (internationalization)__ - способ создания приложений, при котором их можно легко адаптировать для разных аудиторий, говорящих на разных языках.
|
||||
|
||||
__Локализация (localization)__ - адаптация интерфейса приложения под несколько языков. Добавление нового языка может внести определенные сложности в локализацию интерфейса.
|
||||
|
@ -1231,4 +1231,4 @@ __Локализация (localization)__ - адаптация интерфей
|
|||
+ [ggenikus.github.io](https://ggenikus.github.io/blog/2014/05/04/gc/)
|
||||
+ [Санкт-Петербургская группа тестирования JVM](https://blogs.oracle.com/vmrobot/entry/основы_сборки_мусора_в_hotspot)
|
||||
+ [Объектно-ориентированное программирование](http://oop-java.blogspot.ru/2006/02/blog-post_21.html)
|
||||
+ [JavaRush](http://info.javarush.ru/)
|
||||
+ [JavaRush](http://info.javarush.ru/)
|
||||
|
|
30
css.md
30
css.md
|
@ -1,6 +1,6 @@
|
|||
[Вопросы для собеседования на Java Junior](README.md)
|
||||
|
||||
#Основы CSS
|
||||
# Основы CSS
|
||||
+ [Что такое _«CSS»_?](#Что-такое-css)
|
||||
+ [Как в CSS обозначаются комментарии?](#Как-в-css-обозначаются-комментарии)
|
||||
+ [Что такое _«селектор»_?](#Что-такое-селектор)
|
||||
|
@ -16,19 +16,19 @@
|
|||
+ [Как сделать жирным текст во всех элементах `<p>`?](#Как-сделать-жирным-текст-во-всех-элементах-p)
|
||||
+ [Как задать красный цвет для всех элементов, имеющих класс `red`?](#Как-задать-красный-цвет-для-всех-элементов-имеющих-класс-red)
|
||||
|
||||
##Что такое _«CSS»_?
|
||||
## Что такое _«CSS»_?
|
||||
__CSS, Cascading Style Sheets (каскадные таблицы стилей)__ - формальный язык описания внешнего вида документа, написанного с использованием языка разметки, который применяется к элементам web-страницы для управления их видом и положением.
|
||||
|
||||
Основной целью разработки CSS являлось разделение описания логической структуры web-страницы, которое производится с помощью HTML или других языков разметки от описания внешнего вида этой web-страницы, которое производится с помощью CSS.
|
||||
|
||||
[к оглавлению](#Основы-css)
|
||||
|
||||
##Как в CSS обозначаются комментарии?
|
||||
## Как в CSS обозначаются комментарии?
|
||||
Чтобы пометить, что текст является комментарием, применяют конструкцию `/* ... */`
|
||||
|
||||
[к оглавлению](#Основы-css)
|
||||
|
||||
##Что такое _«селектор»_?
|
||||
## Что такое _«селектор»_?
|
||||
__Селектор__ – это правило, на основании которого осуществляется выбор элементов в HTML документе для того, чтобы применить к ним определённые стили.
|
||||
|
||||
```css
|
||||
|
@ -41,7 +41,7 @@ font-size: 20px;
|
|||
|
||||
[к оглавлению](#Основы-css)
|
||||
|
||||
##Перечислите основные виды селекторов.
|
||||
## Перечислите основные виды селекторов.
|
||||
|
||||
+ __селектор `*`__ - выбор всех элементов;
|
||||
+ __селектор элемента__ - выбор всех элементов в HTML документе, имеющих указанный тег (например: `div`);
|
||||
|
@ -52,7 +52,7 @@ font-size: 20px;
|
|||
|
||||
[к оглавлению](#Основы-css)
|
||||
|
||||
##Что такое псевдокласс?
|
||||
## Что такое псевдокласс?
|
||||
Псевдокласс определяет динамическое состояние элементов, которое изменяется из-за действий пользователя, или же соответствует текущему положению в дереве документа. В отличие от настоящего класса, в явном виде псеводкласс в HTML не указывается, а в CSS указывается через `:` непосредственно после селектора.
|
||||
|
||||
Наиболее известные псевдоклассы:
|
||||
|
@ -83,7 +83,7 @@ a.snowman:hover {
|
|||
|
||||
[к оглавлению](#Основы-css)
|
||||
|
||||
##Какие существуют селекторы аттрибутов?
|
||||
## Какие существуют селекторы аттрибутов?
|
||||
+ __`[атрибут]`__ - все элементы, имеющие указанный `атрибут`;
|
||||
+ __`[атрибут=значение]`__ - все элементы, имеющие `атрибут`, значение которого равно `"значение"`;
|
||||
+ __`[атрибут^=занчение]`__ - все элементы, имеющие `атрибут`, значение которого начинается с `значение`;
|
||||
|
@ -94,27 +94,27 @@ a.snowman:hover {
|
|||
|
||||
[к оглавлению](#Основы-css)
|
||||
|
||||
##В чем разница между `#my` и `.my`?
|
||||
## В чем разница между `#my` и `.my`?
|
||||
`#my` — селектор идентификатора, а `.my` — селектор класса.
|
||||
|
||||
[к оглавлению](#Основы-css)
|
||||
|
||||
##В чем разница между `margin` и `padding`?
|
||||
## В чем разница между `margin` и `padding`?
|
||||
`margin` — внешний отступ, а `padding` — внутренний отступ.
|
||||
|
||||
[к оглавлению](#Основы-css)
|
||||
|
||||
##В чем заключается разница между значениями `0` и `auto` в свойстве `margin`?
|
||||
## В чем заключается разница между значениями `0` и `auto` в свойстве `margin`?
|
||||
В вертикальных полях — `auto` всегда означает `0`. В горизонтальных полях — `auto` означает `0` только тогда, когда свойство `width` также `auto`.
|
||||
|
||||
[к оглавлению](#Основы-css)
|
||||
|
||||
##Какое свойство задает цвет фона?
|
||||
## Какое свойство задает цвет фона?
|
||||
Цвет фона задает свойство `background-color`.
|
||||
|
||||
[к оглавлению](#Основы-css)
|
||||
|
||||
##Как убрать подчеркивание для всех ссылок на странице?
|
||||
## Как убрать подчеркивание для всех ссылок на странице?
|
||||
```css
|
||||
a {
|
||||
text-decoration: none;
|
||||
|
@ -123,12 +123,12 @@ a {
|
|||
|
||||
[к оглавлению](#Основы-css)
|
||||
|
||||
##Для чего используется свойство `clear`?
|
||||
## Для чего используется свойство `clear`?
|
||||
`clear` устанавливает, с какой стороны элемента запрещено его обтекание другими элементами.
|
||||
|
||||
[к оглавлению](#Основы-css)
|
||||
|
||||
##Как сделать жирным текст во всех элементах `<p>`?
|
||||
## Как сделать жирным текст во всех элементах `<p>`?
|
||||
```css
|
||||
p {
|
||||
font-weight: bold;
|
||||
|
@ -137,7 +137,7 @@ p {
|
|||
|
||||
[к оглавлению](#Основы-css)
|
||||
|
||||
##Как задать красный цвет для всех элементов, имеющих класс `red`?
|
||||
## Как задать красный цвет для всех элементов, имеющих класс `red`?
|
||||
```css
|
||||
.red {
|
||||
color: red;
|
||||
|
|
40
db.md
40
db.md
|
@ -1,6 +1,6 @@
|
|||
[Вопросы для собеседования на Java Junior](README.md)
|
||||
|
||||
#Базы данных
|
||||
# Базы данных
|
||||
+ [Что такое _«база данных»_?](#Что-такое-база-данных)
|
||||
+ [Что такое _«система управления базами данных»_?](#Что-такое-система-управления-базами-данных)
|
||||
+ [Что такое _«реляционная модель данных»_?](#Что-такое-реляционная-модель-данных)
|
||||
|
@ -21,12 +21,12 @@
|
|||
+ [Какие существуют уровни изолированности транзакций?](#Какие-существуют-уровни-изолированности-транзакций)
|
||||
+ [Какие проблемы могут возникать при параллельном доступе с использованием транзакций?](#Какие-проблемы-могут-возникать-при-параллельном-доступе-с-использованием-транзакций)
|
||||
|
||||
##Что такое _«база данных»_?
|
||||
## Что такое _«база данных»_?
|
||||
__База данных__ — организованный и адаптированный для обработки вычислительной системой набор информации.
|
||||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Что такое _«система управления базами данных»_?
|
||||
## Что такое _«система управления базами данных»_?
|
||||
__Система управления базами данных (СУБД)__ - набор средств общего или специального назначения, обеспечивающий создание, доступ к материалам и управление базой данных.
|
||||
|
||||
Основные функции СУБД:
|
||||
|
@ -38,7 +38,7 @@ __Система управления базами данных (СУБД)__ -
|
|||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Что такое _«реляционная модель данных»_?
|
||||
## Что такое _«реляционная модель данных»_?
|
||||
__Реляционная модель данных__ — это логическая модель данных и прикладная теория построения реляционных баз данных.
|
||||
|
||||
Реляционная модель данных включает в себя следующие компоненты:
|
||||
|
@ -50,7 +50,7 @@ __Реляционная модель данных__ — это логическ
|
|||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Дайте определение терминам _«простой»_, _«составной» (composite)_, _«потенциальный» (candidate)_ и _«альтернативный» (alternate)_ ключ.
|
||||
## Дайте определение терминам _«простой»_, _«составной» (composite)_, _«потенциальный» (candidate)_ и _«альтернативный» (alternate)_ ключ.
|
||||
__Простой ключ__ состоит из одного атрибута (поля). __Составной__ - из двух и более.
|
||||
|
||||
__Потенциальный ключ__ - простой или составной ключ, который уникально идентифицирует каждую запись набора данных. При этом потенциальный ключ должен обладать критерием неизбыточности: при удалении любого из полей набор полей перестает уникально идентифицировать запись.
|
||||
|
@ -59,7 +59,7 @@ __Потенциальный ключ__ - простой или составно
|
|||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Что такое _«первичный ключ» (primary key)_? Каковы критерии его выбора?
|
||||
## Что такое _«первичный ключ» (primary key)_? Каковы критерии его выбора?
|
||||
__Первичный ключ (primary key)__ в реляционной модели данных один из _потенциальных ключей_ отношения, выбранный в качестве основного ключа (ключа по умолчанию).
|
||||
|
||||
Если в отношении имеется единственный потенциальный ключ, он является и первичным ключом. Если потенциальных ключей несколько, один из них выбирается в качестве первичного, а другие называют _«альтернативными»_.
|
||||
|
@ -68,19 +68,19 @@ __Первичный ключ (primary key)__ в реляционной моде
|
|||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Что такое _«внешний ключ» (foreign key)_?
|
||||
## Что такое _«внешний ключ» (foreign key)_?
|
||||
__Внешний ключ (foreign key)__ — подмножество атрибутов некоторого отношения A, значения которых должны совпадать со значениями некоторого потенциального ключа некоторого отношения B.
|
||||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Что такое _«нормализация»_?
|
||||
## Что такое _«нормализация»_?
|
||||
_Нормализация_ - это процесс преобразования отношений базы данных к виду, отвечающему нормальным формам (пошаговый, обратимый процесс замены исходной схемы другой схемой, в которой наборы данных имеют более простую и логичную структуру).
|
||||
|
||||
Нормализация предназначена для приведения структуры базы данных к виду, обеспечивающему минимальную логическую избыточность, и не имеет целью уменьшение или увеличение производительности работы или же уменьшение или увеличение физического объёма базы данных. Конечной целью нормализации является уменьшение потенциальной противоречивости хранимой в базе данных информации.
|
||||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Какие существуют нормальные формы?
|
||||
## Какие существуют нормальные формы?
|
||||
__Первая нормальная форма (1NF)__ - Отношение находится в 1NF, если значения всех его атрибутов атомарны (неделимы).
|
||||
|
||||
__Вторая нормальная форма (2NF)__ - Отношение находится в 2NF, если оно находится в 1NF, и при этом все неключевые атрибуты зависят только от ключа целиком, а не от какой-то его части.
|
||||
|
@ -99,12 +99,12 @@ __Доменно-ключевая нормальная форма (DKNF)__ - О
|
|||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Что такое _«денормализация»_? Для чего она применяется?
|
||||
## Что такое _«денормализация»_? Для чего она применяется?
|
||||
__Денормализация базы данных__ — это процесс осознанного приведения базы данных к виду, в котором она не будет соответствовать правилам нормализации. Обычно это необходимо для повышения производительности и скорости извлечения данных, за счет увеличения избыточности данных.
|
||||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Какие существуют типы связей в базе данных? Приведите примеры.
|
||||
## Какие существуют типы связей в базе данных? Приведите примеры.
|
||||
+ __Один к одному__ - любому значению атрибута А соответствует только одно значение атрибута В, и наоборот.
|
||||
|
||||
>Каждый университет гарантированно имеет 1-го ректора: _1 университет → 1 ректор_.
|
||||
|
@ -119,7 +119,7 @@ __Денормализация базы данных__ — это процесс
|
|||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Что такое _«индексы»_? Для чего их используют? В чём заключаются их преимущества и недостатки?
|
||||
## Что такое _«индексы»_? Для чего их используют? В чём заключаются их преимущества и недостатки?
|
||||
__Индекс (index)__ — объект базы данных, создаваемый с целью повышения производительности выборки данных.
|
||||
|
||||
Наборы данных могут иметь большое количество записей, которые хранятся в произвольном порядке, и их поиск по заданному критерию путём последовательного просмотра набора данных запись за записью может занимать много времени. Индекс формируется из значений одного или нескольких полей и указателей на соответствующие записи набора данных, - таким образом, достигается значительный прирост скорости выборки из этих данных.
|
||||
|
@ -149,7 +149,7 @@ __Индекс (index)__ — объект базы данных, создава
|
|||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Какие типы индексов существуют?
|
||||
## Какие типы индексов существуют?
|
||||
|
||||
__По порядку сортировки__
|
||||
+ _упорядоченные_ — индексы, в которых элементы упорядочены;
|
||||
|
@ -210,31 +210,31 @@ __Индексы в кластерных системах__
|
|||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##В чем отличие между кластерными и некластерными индексами?
|
||||
## В чем отличие между кластерными и некластерными индексами?
|
||||
Некластерные индексы - данные физически расположены в произвольном порядке, но логически упорядочены согласно индексу. Такой тип индексов подходит для часто изменяемого набора данных.
|
||||
|
||||
При кластерном индексировании данные физически упорядочены, что серьезно повышает скорость выборок данных (но только в случае последовательного доступа к данным). Для одного набора данных может быть создан только один кластерный индекс.
|
||||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Имеет ли смысл индексировать данные, имеющие небольшое количество возможных значений?
|
||||
## Имеет ли смысл индексировать данные, имеющие небольшое количество возможных значений?
|
||||
Примерное правило, которым можно руководствоваться при создании индекса - если объем информации (в байтах) НЕ удовлетворяющей условию выборки меньше, чем размер индекса (в байтах) по данному условию выборки, то в общем случае оптимизация приведет к замедлению выборки.
|
||||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Когда полное сканирование набора данных выгоднее доступа по индексу?
|
||||
## Когда полное сканирование набора данных выгоднее доступа по индексу?
|
||||
Полное сканирование производится многоблочным чтением. Сканирование по индексу - одноблочным. Также, при доступе по индексу сначала идет сканирование самого индекса, а затем чтение блоков из набора данных. Число блоков, которые надо при этом прочитать из набора зависит от фактора кластеризации. Если суммарная стоимость всех необходимых одноблочных чтений больше стоимости полного сканирования многоблочным чтением, то полное сканирование выгоднее и оно выбирается оптимизатором.
|
||||
|
||||
Таким образом, полное сканирование выбирается при слабой селективности предикатов зароса и/или слабой кластеризации данных, либо в случае очень маленьких наборов данных.
|
||||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Что такое _«транзакция»_?
|
||||
## Что такое _«транзакция»_?
|
||||
__Транзакция__ - это воздействие на базу данных, переводящее её из одного целостного состояния в другое и выражаемое в изменении данных, хранящихся в базе данных.
|
||||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Назовите основные свойства транзакции.
|
||||
## Назовите основные свойства транзакции.
|
||||
__Атомарность (atomicity)__ гарантирует, что никакая транзакция не будет зафиксирована в системе частично. Будут либо выполнены все её подоперации, либо не выполнено ни одной.
|
||||
|
||||
__Согласованность (consistency)__. Транзакция, достигающая своего нормального завершения и, тем самым, фиксирующая свои результаты, сохраняет согласованность базы данных.
|
||||
|
@ -245,7 +245,7 @@ __Долговечность (durability)__. Независимо от проб
|
|||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Какие существуют уровни изолированности транзакций?
|
||||
## Какие существуют уровни изолированности транзакций?
|
||||
В порядке увеличения изолированности транзакций и, соответственно, надёжности работы с данными:
|
||||
|
||||
+ __Чтение неподтверждённых данных (грязное чтение) (read uncommitted, dirty read)__ — чтение незафиксированных изменений как своей транзакции, так и параллельных транзакций. Нет гарантии, что данные, изменённые другими транзакциями, не будут в любой момент изменены в результате их отката, поэтому такое чтение является потенциальным источником ошибок. Невозможны потерянные изменения, возможны неповторяемое чтение и фантомы.
|
||||
|
@ -255,7 +255,7 @@ __Долговечность (durability)__. Независимо от проб
|
|||
|
||||
[к оглавлению](#Базы-данных)
|
||||
|
||||
##Какие проблемы могут возникать при параллельном доступе с использованием транзакций?
|
||||
## Какие проблемы могут возникать при параллельном доступе с использованием транзакций?
|
||||
При параллельном выполнении транзакций возможны следующие проблемы:
|
||||
|
||||
+ __Потерянное обновление (lost update)__ — при одновременном изменении одного блока данных разными транзакциями одно из изменений теряется;
|
||||
|
|
Loading…
Reference in New Issue