Проект

Общее

Профиль

JAVA CORE » История » Версия 8

Александр Александров, 24.04.2019 01:42

1 1 Александр Александров
h1. JAVA CORE
2
3
h2. Вопросы
4
5
# Чем отличается JRE, JVM и JDK?
6
# Опишите модификаторы доступа в Java.
7
# Что такое package level access.
8
# Чем абстрактный клас отличается от интерфейса? В каких случаях Вы бы использовали абстрактный класс, а в каких интерфейс?
9
# Может ли объект получить доступ к private-переменной класса? Если, да, то каким образом?
10
# Для чего в джаве статические блоки?
11
# Можно ли перегрузить static метод?
12
# Расскажите про внутренние классы. Когда вы их будете использовать?
13
# В чем разница между переменной экземпляра и статической переменной? Приведите пример.
14
# Приведите пример когда можно использовать статический метод?
15
# Расскажите про классы- загрузчики и про динамическую зарузку классов.
16
# Что такое статическая и что такое динамическая загрузка класса?
17
# Для чего нужен оператор "assert" в джава?
18
# Почему в некоторых интерфейсах вообще не определяют методов?
19
# Какая основная разница между String, StringBuffer, StringBuilder?
20
# Расскажите про потоки ввода-вывода Java.
21
# Что такое Heap и Stack память в Java?
22
# Какая разница между Stack и Heap памятью в Java?
23
# Расскажите про модель памяти в джава?
24
# Как работает сборщик мусора (garbage collector)?
25
# Расскажите про приведение типов. Что такое понижение и повышение типа? Когда вы получаете ClassCastException?
26
# Что такое статический класс, какие особенности его использования?
27
# Каким образом из вложенного класса получить доступ к полю внешнего класса.
28
# Какие существуют типы вложенных классов? Для чего они используются?
29
# Возможно ли при переопределении (override) метода изменить:
30
## Модификатор доступа
31
## Возвращаемый тип
32
## Тип аргумента или количество
33
## Имя аргументов
34
# Изменять порядок, количество или вовсе убрать секцию throws?
35
# Что такое autoboxing?
36
# Что такое Generics?
37
# Какова истинная цель использования обобщенных типов в Java?
38
# Каким образом передаются переменные в методы, по значению или по ссылке?
39
# Какие методы есть у класса Object?
40
# Правила переопределения метода Object.equals().
41
# Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
42
# Какая связь между hashCode и equals?
43
# Каким образом реализованы методы hashCode и equals в классе Object?
44
# Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
45
# Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
46
# Для чего нужен метод hashCode()?
47
# Правила переопределения метода Object.hashCode().
48
# Расскажите про клонирование объектов. В чем отличие между поверхностным и глубоким клонированием?
49
# Правила переопределения метода Object.clone().
50
# Где и как вы можете использовать закрытый конструктор?
51
# Что такое конструктор по умолчанию?
52
# Опишите метод Object.finalize().
53
# Чем отличаются слова final, finally и finalize?
54
# Опишите иерархию исключений.
55
# Какие виды исключений в Java вы знаете, чем они отличаются?
56
# Что такое checked и unchecked Exception?
57
# Как создать свой unchecked Exception?
58
# Какие есть Unchecke exeption?
59
# Что такое Error?
60
# Опишите работу блока try-catch-finally.
61
# Возможно ли использование блока try-finally (без catch)?
62
# Всегда ли исполняется блок finally?
63
# Какие есть особенности класса String? что делает метод intern().
64
# Можно ли наследовать строковый тип, почему?
65
# Почему строка является популярным ключом в HashMap в Java?
66
# Дайте определение понятию конкатенация строк.
67
# Как перевернуть строку?
68
# Как сравнить значение двух строк?
69
# Как обрезать пробелы в начале и конце строки?
70
# Дайте определение понятию "пул строк".
71
# Можно ли синхронизировать доступ к строке?
72
# Как правильно сравнить значения строк двух различных объектов типа String и StringBuffer?
73
# Почему строка неизменная и финализированная в Java?
74
# Напишите метод удаления данного символа из строки.
75
# Что такое рефлексия?
76
# Что произойдет со сборщиком мусора (GC), если во время выполнения метода finalize() некоторого объекта произойдет исключение?
77
# Что такое интернационализация, локализация?
78
# Что такое Аннотации в Java?
79
# Какие функции выполняет Аннотации?
80
# Какие встроенные аннотации в Java вы знаете?
81
# Что делают аннотации @Retention, @Documented, @Target и @Inherited?
82
# Что делают аннотации @Override, @Deprecated, @SafeVarargs и @SuppressWarnings?
83
# Какой жизненный цикл аннотации можно указать с помощью @Retention?
84
# К каким элементам можно применять аннотацию, как это указать?
85
# Как создать свою Аннотацию?
86
# Атрибуты каких типов допустимы в аннотациях?
87
# Что такое JMX?
88
# Какие выгоды предлагает JMX?
89
# Что еще умеет JMX кроме дистанционного управления?
90
# Что такое MBean?
91
# Какие типы MBeans существуют?
92
# Что такое MBean Server?
93
# Какие механизмы обеспечивают безопасность в технологии Java?
94
# Назовите несколько видов проверок которые выполняет верификатор байт-кода Java?
95
# Что вы знаете о "диспетчере защиты" в Java?
96
# Что такое JAAS?
97
# Что такое Рефакторинг?
98
99
h2. Ответы
100
101
h3. Чем отличается JRE, JVM и JDK?
102
103 2 Александр Александров
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 Environmen (JRE). Виртуальная машина Java интерпретирует Байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM может также использоваться для выполнения программ, написанных на других языках программирования.
104
105 1 Александр Александров
h3. Опишите модификаторы доступа в Java.
106
107 2 Александр Александров
В Java существуют следующие модификаторы доступа:
108
* private: (используется конструкторах, внутренних классах, методах и полях класса) - Доступ разрешен только в текущем классе.
109
* default (package-private): (используется в классах, конструкторах, интерфейсах, внутренних классах, методах и полях класса) - Доступ на уровне пакета. Если класс будет так объявлен он будет доступен только внутри пакета.
110
* protected: (используется конструкторах, внутренних классах, методах и полях класса) Модификатор доступа на уровне пакета и в иерархии наследования.
111
* public: (используется в классах, конструкторах, интерфейсах, внутренних классах, методах и полях класса) - Модификатор доступа общественный, доступен всем. Последовательность модификаторов по убыванию уровня закрытости: private, default ,protected, public)
112
113 1 Александр Александров
h3. Что такое package level access.
114
115 2 Александр Александров
Доступ из классов одного package-а в классы другого package-a.
116
117 1 Александр Александров
h3. Чем абстрактный клас отличается от интерфейса? В каких случаях Вы бы использовали абстрактный класс, а в каких интерфейс?
118
119 2 Александр Александров
Абстрактный класс это класс, который помечен как "abstract", он может содержать абстрактные методы, а может их и не содержать. Экземпляр абстрактного класса нельзя создать.
120
Класс, который наследуется от абстрактного класса может реализовывать абстрактные методы, а может и не реализовывать, тогда класс наследник должен быть тоже абстрактным. Также если класс наследник переопределяет реализованный в абстрактном классе родители метод, его можно переопределить с модификатором абстракт! Т.е отказаться от реализации. Соответственно данный класс должен быть также абстрактным также. Что касается интерфейса, то в нем находятся только абстрактные методы и константы, так было до выхода Java 8. Начиная с Java 8 кроме абстрактных методов мы также можем использовать в интерфейсах стандартные методы (default methods) и статические методы (static methods).
121
* Default метод в интерфейсе - это метод в интерфейсе с по умолчанию реализованной логикой, который не требуется обязательно определять в реализации этого интерфейса.
122
* Static методы в интерфейсе - это по существу то же самое, что static-методы в абстрактном классе. 
123
124
При реализации интерфейса, класс обязан реализовать все методы интерфейса. Иначе класс должен быть помечен как абстрактный. Интерфейс также может содержать внутренние классы. И не абстрактные методы в них. Что же использовать Интерфейс или Абстрактный класс? Абстрактный класс используется когда нам нужна какая-то реализация по умолчанию. Интерфейс используется когда классу нужно указать конкретное поведение. Часто интерфейс и абстрактный класс комбинируют, т.е. имплементируют интерфейс в абстрактном классе, чтоб указать поведение и реализацию по умолчанию. Это хорошо видно на примере свига:
125
126
<pre><code class="java">
127 8 Александр Александров
class abstract AbstractTableModel implements TableModel {
128 2 Александр Александров
}
129
class MyTableModel extends AbstractTableModel {
130
}
131
</code></pre>
132
133
Мы создаем свою модель таблицы с определенным поведением и уже с реализацией по умолчанию.
134
135
*ВАЖНО!* При реализации интерфейса, необходимо реализовать все его методы, иначе будет Fatal error, так же это можно избежать, присвоив слово abstract.
136
137
Пример:
138
139
<pre><code class="java">
140
interface I {
141
    public void F();
142
    public void say();
143
}
144
145
public abstract class A implements I {
146
    
147
    @Override
148
    public void say() {
149
       System.out.println("Hello!"); 
150
    }
151
    // public void F(); - not implenented
152
}
153
</code></pre>
154
155 1 Александр Александров
h3. Может ли объект получить доступ к private-переменной класса? Если, да, то каким образом?
156
157 2 Александр Александров
Вообще доступ у приватной переменной класса можно получить только внутри класса, в котором она объявлена. Также доступ к приватным переменным можно осуществить через механизм _Java Reflection API._
158 1 Александр Александров
159 2 Александр Александров
h3. Для чего в java статические блоки?
160
161
Статические блоки в java выполняются до выполнения конструктора, с помощью них инициализируют статические поля к примеру. 
162
163
<pre><code class="java">
164
static final int i;
165
static {
166
    i = 10;
167
}
168
</code></pre>
169
170
Еще один ньюанс, блок статической инициализации может создаваться сам при компиляции программы.
171
172
Например:
173
174
<pre><code class="java">
175
public static int MAX = 100;
176
</code></pre>
177
178
Будет создан код:
179
180
<pre><code class="java">
181
public static int MAX;
182
static {
183
    MAX = 100;
184
}
185
</code></pre>
186
187 1 Александр Александров
h3. Можно ли перегрузить static метод?
188
189 2 Александр Александров
Статические методы могут перегружаться нестатическими и наоборот - без ограничений. А вот в переопределении статического метода смысла нет.
190
191 1 Александр Александров
h3. Расскажите про внутренние классы. Когда вы их будете использовать?
192
193 2 Александр Александров
Внутренний класс - это класс, который находится внутри класса или интерфейса. При этом он получает доступ ко всем полям и методам своего внешнего класса. Для чего он может применятся? Например чтоб обеспечить какую-то дополнительную логику класса. Хотя использование внутренних классов усложняет программу, рекомендуется избегать их использование.
194
195 1 Александр Александров
h3. В чем разница между переменной экземпляра и статической переменной? Приведите пример.
196
197 2 Александр Александров
Статические переменные инициализируются при загрузке класса класслодером, и не зависят от объекта. Переменная экземпляра инициализируется при создании класса.
198
199
Пример: 
200
201
Например нам нужна глобальная переменная для всех объектов класс, например число посещений пользователей определенной статьи в интернете. При каждом новом посещении статьи создается новый объект и инкрементируется переменная посещений.
202
203 1 Александр Александров
h3. Приведите пример когда можно использовать статический метод?
204
205 2 Александр Александров
Статические методы могут быть использованы для инициализации статических переменных. Часто статические методы используются в классах утилитах, таких как Collections, Math, Arrrays
206 1 Александр Александров
207 2 Александр Александров
h3. Расскажите про классы- загрузчики и про динамическую загрузку классов.
208
209
Любой класс, используемый в джава программу так или иначе был загружен в контекст программы каким-то загрузчиком. Все виртуальные машины джава включают хотябы один загрузчик классов, так называем базовый загрузчик. Он загружает все основные классы, это классы из rt.jar. Интересно то, что этот загрузчик никак не связан с программой, тоесть мы не можем получить например у java.lang.Object имя зарузчика, метод getClassLoader() вернет нам null. Следующий загрузчик - это загрузчик расширений, он загружает классы из $JAVA_HOME/lib/ext. Далее по иерархии идет системный загрузчик, он загружает классы, путь к которым указан в переменно класпас. Для примера предположим что у нас есть некий пользовательский класс MyClass и мы его используем. Как идет его загрузка :
210
211
Сначала системный загрузчик пытается найти его в своем кэше загрузок его, если найден - класс успешно загружается, иначе управление загрузкой передается загрузчику расширений, он также проверяет свой кэш загрузок и в случае неудачи передает задачу базовому загрузчику. Тот проверяет кэш и в случае неудачи пытается его загрузить, если загрузка прошла успешно - загрузка закончена. Если нет - передает управление загрузчику расширений. Загрузчик расширений пытается загрузить класс и в случае неудачи передает это дело системному загрузчику. Системный загрузчик пытается загрузить класс и в случае неудачи возбуждается исключение java.lang.ClassNotFoundException. 
212
213
Вот так работает загрузка классов в джава. Так называемое делегирование загрузки. Если в системе присутствуют пользовательские загрузики, то они должны быть унаследованы от класса java.lang.ClassLoader .
214
215 1 Александр Александров
h3. Что такое статическая и что такое динамическая загрузка класса?
216
217 2 Александр Александров
Статическая загрузка класса происходит при использовании оператора "new". Динамическая загрузка происходит "на лету" в ходе выполнения программы с помощью статического метода класса Class.forName(имя класса). Для чего нужна динамическая загрузка? Например мы не знаем какой класс нам понадобится и принимаем решение в ходе выполнения программы передавая имя класса в статический метод forName().
218
219 1 Александр Александров
h3. Для чего нужен оператор "assert" в джава?
220
221 2 Александр Александров
Это так называемый оператор утверждений. Он проверяет некое условие, если оно ложно, то генерируется AssertationError 
222
223
assert status: "message error"; 
224
225
Тут проверяется булевская переменная "status".
226
227 1 Александр Александров
h3. Почему в некоторых интерфейсах вообще не определяют методов?
228
229 2 Александр Александров
Это так называемые интерфейсы - маркеры. Они просто указывают что класс относится к определенной группе классов. Например интерфейс Clonable указывает на то, что класс поддерживает механизм клонирования. Степень абстракции в данном случае доведен до абсолюта. В интерфейсе вообще нет никаких объявлений.
230
Интерфейси-маркери в Java:
231
* Searilizable interface
232
* Cloneable interface
233
* Remote interface
234
* ThreadSafe interface
235
236 1 Александр Александров
h3. Какая основная разница между String, StringBuffer, StringBuilder?
237 2 Александр Александров
238 3 Александр Александров
String - неизменяемый класс, то есть для для добавление данных в уже существующую строку, создается новый объект строки. StringBuffer и StringBuilder могут изменятся и добавление строки не такое дорогостоющее с точки зрения памяти. Первый - синхронизированный, второй - нет. Это их единственное различие. Правда если нам нужно сделать подстроку строки, то лучше использовать String, так как ее массив символов не меняется и не создается заново для новой строки. А вот в StringBuffer и StringBuilder для создания подстроки создается новый массив символов.
239 1 Александр Александров
240
h3. Расскажите про потоки ввода-вывода Java.
241
242 3 Александр Александров
Потоки ввода-вывода бывают двух видов:
243
* байтовый поток(InputStream и OutputStream);
244
* символьный поток(Reader и Writer);
245
246
Это все абстрактные классы - декораторы, которым можно добавлять дополнительный функционал, например:
247
248
<pre><code class="java">
249
InputStream in = new FileInputStream(new File("File.txt"));
250
</code></pre>
251
252 1 Александр Александров
h3. Что такое Heap и Stack память в Java?
253
254 3 Александр Александров
Java Heap (куча) - динамически распределяемая область памяти, создаваемая при старте JVM. Используется Java Runtime для выделения памяти под объекты и JRE классы. Создание нового объекта также происходит в куче. Здесь работает сборщик мусора: освобождает память путем удаления объектов, на которые нет каких-либо ссылок. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться с любой части приложения.
255
256
Строгими тезами:
257
258
* Все объекты обитают в куче и попадают туда при создании. 
259
* Объект состоит из полей класса и методов.
260
* В куче выделяется место под сам объект, количество выделенной памяти зависит от полей, если у тебя полем класса, к примеру, служит интовая переменная, то не важно, инициализируешь ты ее как "0" или как "1000000" - объект займет в куче свои биты, + столько байт сколько вмещает тип int(+32 бита), и так с каждым полем.
261
262
Стековая память в Java работает по схеме LIFO (Последний-зашел-Первый-вышел). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе расположение в RAM и достижение процессору через указатель стека. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода. Размер стековой памяти намного меньше объема памяти в куче.
263
264
Строгими тезами:
265
266
* Все методы обитают в стеке и попадают туда при вызове.
267
* Переменные в методах так же имеют стековую память, по скольку они локальные.
268
* Если в методе создается объект, то он помещается в кучу, но его ссылка все еще будет находится в стеке и после того как метод покинет стек - объект станет жертвой сборщика мусора, так как ссылка на него утеряна, и из главного стека программы невозможно будет добраться до такого объекта.
269
270 1 Александр Александров
h3. Какая разница между Stack и Heap памятью в Java?
271
272 3 Александр Александров
Приведем следующие различия между Heap и Stack памятью в Java.
273 1 Александр Александров
274 3 Александр Александров
* Куча используется всеми частями приложения в то время как стек используется только одним потоком исполнения программы.
275
* Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче.
276
* Объекты в куче доступны с любой точки программы, в то время как стековая память не может быть доступна для других потоков.
277
* Управление памятью в стеке осуществляется по схеме LIFO.
278
* Стековая память существует лишь какое-то время работы программы, а память в куче живет с самого начала до конца работы программы.
279
* Мы можем использовать -Xms и -Xmx опции JVM, чтобы определить начальный и максимальный размер памяти в куче. Для стека определить размер памяти можно с помощью опции -Xss .
280
* Если память стека полностью занята, то Java Runtime бросает java.lang.StackOverflowError, а если память кучи заполнена, то бросается исключение java.lang.OutOfMemoryError: Java Heap Space.
281
* Размер памяти стека намного меньше памяти в куче. Из-за простоты распределения памяти (LIFO), стековая память работает намного быстрее кучи.
282
283
h3. Расскажите про модель памяти в java?
284
285
{{dmsf_image(196)}}
286
287
В Java память устроена следующим образом, есть два вида:
288
289
* куча
290
* стек
291
292
Куча состоит из статического контекста и самой кучи/
293
294
Куча состоит из двух частей:
295
296
* Новая куча
297
* Старая куча
298
299
Новая куча в свою очередь состоит из двух частей:
300
301
* Eden(назовем ее первая) куча
302
* Survival(выжившая) куча
303
304
Краткое описание:
305
306
* Eden Space (heap) - в этой области выделятся память под все создаваемые из программы объекты. Большая часть объектов живет недолго (итераторы, временные объекты, используемые внутри методов и т.п.), и удаляются при выполнении сборок мусора это области памяти, не перемещаются в другие области памяти. Когда данная область заполняется (т.е. количество выделенной памяти в этой области превышает некоторый заданный процент), GC выполняет быструю (minor collection) сборку мусора. По сравнению с полной сборкой мусора она занимает мало времени, и затрагивает только эту область памяти - очищает от устаревших объектов Eden Space и перемещает выжившие объекты в следующую область.
307
* Survivor Space (heap) – сюда перемещаются объекты из предыдущей, после того, как они пережили хотя бы одну сборку мусора. Время от времени долгоживущие объекты из этой области перемещаются в Tenured Space.
308
* Tenured (Old) Generation (heap) - Здесь скапливаются долгоживущие объекты (крупные высокоуровневые объекты, синглтоны, менеджеры ресурсов и проч.). Когда заполняется эта область, выполняется полная сборка мусора (full, major collection), которая обрабатывает все созданные JVM объекты.
309
* Permanent Generation (non-heap) - Здесь хранится метаинформация, используемая JVM (используемые классы, методы и т.п.).
310
311 1 Александр Александров
h3. Как работает сборщик мусора (garbage collector)?
312
313 3 Александр Александров
Во-первых что стоит сказать, что у сборщика мусора есть несколько алгоритмов работы, он не один. Когда происходит очистка памяти? Если память в Первой куче полностью заполнена, то туда идет сборщик мусора и делает свою работу) Какую именно, зависит от обстоятельств… Например если в первой кучи много мусора(т.е. объектов с нулевой ссылкой), то сборщик мусора помечает эти объекты, далее те что остались объекты со ссылками он их переносит в Выжившую кучу, а в первой куче он просто все удаляет. Ситуация другая, в первой кучи мало мусора, но очень много рабочих объектов. Как поступает в этом случае сборщик мусора? Он помечает мусор, удаляет его и оставшиеся объекты компонует. Также следует заметить что при нехватке места в Выжившей куче, объекты переносятся в старую кучу, там хранятся как правило долго живущие объекты. Также следует заметить что сборщик мусора вызывается сам периодически, а не только когда памяти не хватает.
314
315 1 Александр Александров
h3. Расскажите про приведение типов. Что такое понижение и повышение типа? Когда вы получаете ClassCastException?
316
317 3 Александр Александров
Приведение типов это установка типа переменной или объекта отличного от текущего. В два есть два вида приведения:
318
319
* автоматическое
320
* не автоматическое
321
322
Автоматическое происходит например:
323
324
<pre>
325
byte-> short->int->long->float->double
326
</pre>
327
328
то-есть если мы расширяем тип, то явное преобразование не требуется, приведение происходит автоматически. Если же мы сужаем, то необходимо явно указывать приведение типа. 
329
В случае же с объектами, то мы можем сделать автоматическое приведение от наследника к родителю, но никак не наоборот, тогда вылетит ClassCastException.
330
331 1 Александр Александров
h3. Что такое статический класс, какие особенности его использования?
332
333 3 Александр Александров
Статическим классом может быть только внутренний класс (определение класса размещается внутри другого класса). В объекте обычного внутреннего класса хранится ссылка на объект внешнего класса. Внутри статического внутреннего класса такой ссылки нет. То есть: 
334
335
Для создания объекта статического внутреннего класса не нужен объект внешнего класса. Из объекта статического вложенного класса нельзя обращаться к нестатическим членам внешнего класса напрямую. И еще обычные внутренние классы не могут содержать статические методы и члены.
336
337
*Зачем вообще нужны внутренние классы?*
338
339
Каждый внутренний класс способен независимо наследовать определенную реализацию. Таким образом внутренний класс не ограничен при наследовании в ситуациях, когда внешний класс уже наследует реализацию. То есть это как бы вариант решения проблемы множественного наследования.
340
341 1 Александр Александров
h3. Каким образом из вложенного класса получить доступ к полю внешнего класса.
342
343 3 Александр Александров
Если класс внутренний то: Внешний класс.this. Поле внешнего класса Если класс статический внутренний(вложенный),то в методе нужно создать объект внешнего класса, и получить доступ к его полю.Или второй вариант объявить это поле внешнего класса как static
344
345 1 Александр Александров
h3. Какие существуют типы вложенных классов? Для чего они используются?
346 3 Александр Александров
347
Вложенные классы существуют внутри других классов. Нормальный класс - полноценный член пакета. Вложенные классы, которые стали доступны начиная с Java 1.1, могут быть четырех типов:
348
349
* статические члены класса
350
* члены класса
351
* локальные классы
352
* анонимные классы
353
354
Статические члены классов (static nested classes) - как и любой другой статический метод, имеет доступ к любым статическим методам своего внешнего класса, в том числе и к приватным. К нестатическим полям и методам обрамляющего класса он не может обращаться напрямую. Он может использовать их только через ссылку на экземпляр класса родителя. Члены класса - локальные классы, объявленные внутри блока кода. Эти классы видны только внутри блока. Анонимные классы - Эти типы классов не имеют имени и видны только внутри блока.
355 1 Александр Александров
356
h3. Возможно ли при переопределении (override) метода изменить:
357
358 4 Александр Александров
Переопределение методов действует при наследовании классов, т.е. в классе наследнике объявлен метод с такой же сигнатурой что и в классе родителе. Значит этот метод переопределил метод своего суперкласса. 
359 1 Александр Александров
360 4 Александр Александров
Несколько нюансов по этому поводу:
361 1 Александр Александров
362 4 Александр Александров
* Модификатор доступа в методе класса наследника должен быть НЕ уже чем в классе родителе, иначе будет ошибка компиляции.
363
* Описание исключения в переопределенном методе класса наследника должен быть НЕ шире чем в классе родителе, иначе ошибка компиляции.
364
* Метод обьявленный как "private" в классе родителе нельзя переопределить!
365 1 Александр Александров
366 4 Александр Александров
h4. Модификатор доступа
367 1 Александр Александров
368 4 Александр Александров
Да, если расширять 
369 1 Александр Александров
370 4 Александр Александров
<pre>
371
package -> protected -> public
372
</pre>
373
374
h4. Возвращаемый тип
375
376
Да, если выполняется Downcasting(понижающее преобразование, преобразование вниз по иерархии) то есть возвращаемый тип в переопределенном методе класса Integer)
377
378
h4. Тип аргумента или количество
379
380
Нет, в таком случае происходит Overload(перегрузка)
381
382
h4. Имя аргументов
383
384
Да
385
386
h4. Изменять порядок, количество или вовсе убрать секцию throws?
387
388
Возможно изменять порядок. Возможно вовсе убрать секцию throws в методе, так как она уже определена. Так же возможно добавлять новые исключения, которые наследуются от объявленных или исключения времени выполнения.
389
390 1 Александр Александров
h3. Что такое autoboxing?
391
392 4 Александр Александров
Autoboxing/Unboxing - автоматическое преобразование между скалярными типами Java и соответствующими типами-врапперами (например, между int - Integer). Наличие такой возможности сокращает код, поскольку исключает необходимость выполнения явных преобразований типов в очевидных случаях.
393
394 1 Александр Александров
h3. Что такое Generics?
395
396 4 Александр Александров
*Java Generics* - это технический термин, обозначающий набор свойств языка позволяющих определять и использовать обобщенные типы и методы. Обобщенные типы или методы отличаются от обычных тем, что имеют типизированные параметры.
397
Примером дженериков или обобщенных типов может служить библитека с коллекциями в Java. Например, класс _LinkedList<E>_ - типичный обобщенный тип. Он содержит параметр E, который представляет тип элементов, которые будут храниться в коллекции. Вместо того, чтобы просто использовать _LinkedList_ , ничего не говоря о типе элемента в списке, мы можем использовать _LinkedList<String>_ или _LinkedList<Integer>_ . Создание объектов обобщенных типов происходит посредством замены параметризированных типов реальными типами данных. Класс типа _LinkedList<E>_ - обобщенный тип, который содержит параметр E. Создание объектов, типа _LinkedList<String>_ или _LinkedList<Integer>_ называются параметризированными типами, а String и Integer - реальные типы аргументов.
398
399 1 Александр Александров
h3. Какова истинная цель использования обобщенных типов в Java?
400
401 4 Александр Александров
Обобщенные типы в Java были изобретены, в первую очередь, для реализации обобщенных коллекций.
402
403 1 Александр Александров
h3. Каким образом передаются переменные в методы, по значению или по ссылке?
404
405 4 Александр Александров
В java параметры в методы передаются по значению, то-есть создаются копии параметров и с ними ведется работа в методе. В случае с примитивными типами, то при передачи параметра сама переменная не будет меняться так как в метод просто копируется ее значение. А вот при передачи объекта копируется ссылка на объект, то-есть если в методе мы поменяем состояние объекта, то и за методом состояние объекта тоже поменяется. Но если мы этой копии ссылки попытаемся присвоить новую ссылку на объект, то старая ссылка у нас не изменится. В случае передачи по значению параметр копируется. Изменение параметра не будет заметно на вызывающей стороне. В Java объекты всегда передаются по ссылке, а примитивы - по значению.
406
407 1 Александр Александров
h3. Какие методы есть у класса Object?
408
409 4 Александр Александров
Object это базовый класс для всех остальных объектов в Java. Каждый класс наследуется от Object. Соответственно все классы наследуют методы класса Object.
410
411
Методы класса Object:
412
413
* public final native Class getClass()
414
* public native int hashCode()
415
* public boolean equals(Object obj)
416
* protected native Object clone() throws CloneNotSupportedException
417
* public String toString()
418
* public final native void notify()
419
* public final native void notifyAll()
420
* public final native void wait(long timeout) throws InterruptedException
421
* public final void wait(long timeout, int nanos) throws InterruptedException
422
* public final void wait() throws InterruptedException
423
* protected void finalize() throws Throwable
424
425 1 Александр Александров
h3. Правила переопределения метода Object.equals().
426
427 4 Александр Александров
# Используйте оператор == что бы проверить ссылки на объект, переданную в метод equals. Если ссылки совпадают - вернуть true. Это не обязательно, нужно скорее для оптимизации, но может сэкономить время в случае "тяжёлых" сравнений.
428
# Используйте оператор instanceof для проверки типа аргумента. Если типы не совпадают, вернуть false.
429
# Преобразуйте аргумент к корректному типу. Так как на предыдущем шаге мы выполнили проверку, преобразование корректно.
430
# Пройтись по всем значимым полям объектов и сравнить их друг с другом. Если все поля равны - вернуть true. Для сравнения простых типов использовать ==. Для полей со ссылкой на объекты использовать equals. Float преобразовывать в int с помощью Float.FloatToIntBits и сравнить с помощью ==. double преобразовывать в long с помощью Double.doubleToLongBits и сравнить с помощью ==. Для коллекций вышеперечисленные правила применяются к каждому элементу коллекции. Нужно учитывать возможность null полей/объектов. Очерёдность сравнения полей может существенно влиять на производительность.
431
# Закончив реализацию equals задайте себе вопрос, является ли метод симметричным, транзитивным и непротиворечивым.
432
433
И ещё несколько дополнительных правил:
434
435
* Переопределив equals, всегда переопределять hashCode.
436
* Не использовать сложную семантику в equals (типа определения синонимов). equals должен сравнивать поля объектов, не более
437
438 1 Александр Александров
h3. Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
439
440 4 Александр Александров
Метод equals() обозначает отношение эквивалентности объектов. Эквивалентным называется отношение, которое является симметричным, транзитивным и рефлексивным. 
441
442
* Рефлексивность: для любого ненулевого x, x.equals(x) вернет true;
443
* Транзитивность: для любого ненулевого x, y и z, если x.equals(y) и y.eqals(z) вернет true, тогда и x.equals(z) вернет true;
444
* Симметричность: для любого ненулевого x и y, x.equals(y) должно вернуть true, тогда и только тогда, когда y.equals(x) вернет true.
445
446
Также для любого ненулевого x, x.equals(null) должно вернуть false.
447
448 1 Александр Александров
h3. Какая связь между hashCode и equals?
449
450 4 Александр Александров
Объекты равны, когда a.equals(b)=true и a.hashCode==b.hashcode -> true Но необязательно, чтобы два различных объекта возвращали различные хэш коды(такая ситуация называется коллизией).
451
452 1 Александр Александров
h3. Каким образом реализованы методы hashCode и equals в классе Object?
453
454 4 Александр Александров
Реализация метода equals в классе Object сводится к проверке на равенство двух ссылок:
455
456
<pre><code class="java">
457
public boolean equals(Object obj) {
458
    return (this == obj);
459
}
460
</code></pre>
461
462
Реализация же метода hashCode класса Object сделана нативной, т.е. определенной не с помощью Java-кода:
463
464
<pre>
465
public native int hashCode();
466
</pre>
467
468
Он обычно возвращает адрес объекта в памяти.
469
470 1 Александр Александров
h3. Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
471
472 4 Александр Александров
Они будут неправильно хранится в контейнерах, использующих хэш коды, таких как HashMap, HashSet. Например HashSet хранит элементы в случайном (на первый взгляд) порядке. Дело в том, что для быстрого поиска HashSet расчитывает для каждлого элемента hashCode и именно по этому ключу ищет и упорядочивает элементы внутри себя.
473
474 1 Александр Александров
h3. Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
475
476 4 Александр Александров
Есть. Необходимо использовать уникальные, лучше примитивные поля, такие как id, uuid, например. Причем, если эти поля задействованы при вычислении hashCode, то нужно их задействовать при выполнении equals. Общий совет: выбирать поля, которые с большой долью вероятности будут различаться.
477
478 1 Александр Александров
h3. Для чего нужен метод hashCode()?
479
480 4 Александр Александров
Существуют коллекции(HashMap, HashSet), которые используют хэш код, как основу при работе с объектами. А если хэш для равных объектов будет разным, то в HashMap будут два равных значения, что является ошибкой. Поэтому необходимо соответствующим образом переопределить метод hashCode(). 
481
482
* Х Хеширование - преобразование входного массива данных произвольной длины в выходную битовую строку фиксированной длины. Такие преобразования также хешем или хеш-кодом.
483
* Хе Хеш-таблице - это структура данных, реализующая интерфейс ассоциативного массива, а именно, она позволяет хранить пары (ключ, значение) и выполнять три операции: операцию добавления новой пары, операцию поиска и операцию удаления пары по ключу.
484
485
Выполнение операции в хеш-таблице начинается с вычисления хеш-функции от ключа. Получающееся хеш-значение i = hash(key) играет роль индекса в массиве H. Затем выполняемая операция (добавление, удаление или поиск) перенаправляется объекту, который хранится в соответствующей ячейке массива H[i]. Одним из методов построения хеш-функции есть метод деления с остатком (division method) состоит в том, что ключу k ставится в соответствие остаток от деления k на m, где m - число возможных хеш-значений.
486
487 1 Александр Александров
h3. Правила переопределения метода Object.hashCode().
488
489 4 Александр Александров
При реализации hashCode используется несколько простых правил. Прежде всего, при вычислении хеш-кода следует использовать те же поля, которые сравниваются в equals. Это, во-первых, даст равенство хеш-кодов для равных обектов, во-вторых, распределено полученное значение будет точно так же, как и исходные данные. Теоретически, можно сделать так, чтобы хеш-код всегда был равен 0, и это будет абсолютно легальная реализация. Другое дело, что ее ценность будет равна тому же самому нулю. Далее. Несмотря на то, что хеш-коды равных объектов должны быть равны, обратное неверно! Два неравных объекта могут иметь равные хеш-коды. Решающее значение имеет не уникальность, а скорость вычисления, потому как это приходится делать очень часто. Потому, в некоторых случаях имеет смысл посчитать хеш-код заранее и просто выдавать его по запросу. Прежде всего это стоит делать тогда, когда вычисление трудоемко, а объект неизменен.
490
491 1 Александр Александров
h3. Расскажите про клонирование объектов. В чем отличие между поверхностным и глубоким клонированием?
492
493 4 Александр Александров
Чтобы объект можно было клонировать, он должен реализовать интерфейс Cloneable(маркер). Использование этого интерфейса влияет на поведение метода "clone" класс Object. Таким образом myObj.clone() создаст нам клон нашего объекта, но этот клон будет поверхностный. Что значит поверхностным? Это значит что клонируется только примитивные поля класса, ссылочные поля не клонируются! Для того, чтоб произвести глубокое клонирование, необходимо в клонируемом классе переопределить метод clone() и в нем произвести клонирование изменяемых полей
494
495 1 Александр Александров
h3. Правила переопределения метода Object.clone().
496 4 Александр Александров
497
Метод clone() в Java используется для клонирования объектов. Т.к. Java работает с объектами с помощью ссылок, то простым присваиванием тут не обойдешься, ибо в таком случае копируется лишь адрес, и мы получим две ссылки на один и тот же объект, а это не то, что нам нужно. Механизм копирования обеспечивает метод clone() класса Object.
498
clone() действует как конструктор копирования. Обычно он вызывает метод clone() суперкласса и т.д. пока не дойдет до Object.
499
Метод clone() класса Object создает и возвращает копию объекта с такими же значениями полей. Object.clone() кидает исключение CloneNotSupportedException если вы пытаетесь клонировать объект не реализующий интерфейс Cloneable. Реализация по умолчанию метода Object.clone() выполняет неполное/поверхностное (shallow) копирование. Если вам нужно полное/глубокое (deep) копирование класса то в методе clone() этого класса, после получения клона суперкласса, необходимо скопировать нужные поля. Синтаксис вызова clone() следующий:
500
501
<pre>
502
Object copy = obj.clone();
503
</pre>
504
505
или чаще:
506
507
<pre>
508
MyClass copy = (MyClass) obj.clone();
509
</pre>
510
511
Один из недостатков метода clone(), это тот факт, что возвращается тип Object, поэтому требуется нисходящее преобразование типа. Однако начиная с версии Java 1.5 при переопределении метода вы можете сузить возвращаемый тип. Пару слов о clone() и final полях. Метод clone() несовместим с final полями. Если вы попробуете клонировать final поле компилятор остановит вас. Единственное решение - отказаться от final.
512
513
Ну и пример использования clone():
514
515
<pre><code class="java">
516
class MyClass implements Cloneable {
517
    public Integer i = 10;
518
519
    public MyClass clone() throws CloneNotSuppotedException {
520
        MyClass obj = (MyClass) super.clone();
521
        obj.i = i;
522
       return obj;    
523
    }
524
    
525
    public String toString() {
526
        return i.toString();
527
    }
528
}
529
530
public class Temp {
531
    public static void main(String args[]) throws CloneNotSupportedException {
532
        MyClass a = new MyClass();
533
        a.i = 11;
534
        MyClass b = a.clone();
535
        MyClass c = a;
536
        System.out.println("a: " + a + "b: " + b + "c: " +c);
537
        a.i = 12;
538
        System.out.println("a: " + a + "b: " + b + "c: " +c);
539
    }
540
}
541
</code></pre>
542
543
Консоль:
544
545
<pre>
546
a: 11 b: 11 c: 11
547
a: 12 b: 11 c: 12
548
</pre>
549
550
Как видите, изменение объекта a повлекло за собой изменение объекта c, а вот с b всё в порядке.
551 1 Александр Александров
552
h3. Где и как вы можете использовать закрытый конструктор?
553
554 5 Александр Александров
Например в качестве паттерна Синглетон. В том же классе создается статический метод. Где и создается экземпляр класса, конечно если он уже не создан, тогда он просто возвращается методом.
555
556 1 Александр Александров
h3. Что такое конструктор по умолчанию?
557
558 5 Александр Александров
В Java если нет явным образом опредёленных конструкторов в классе, то компилятор использует конструктор по умолчанию, опредёленный неявным способом, который аналогичен "чистому", конструктору по умолчанию. Конструктор по умолчанию - это довольно простая конструкция, которая сводится к созданию для типа конструктора без параметров. Так, например, если при объявлении нестатического класса не объявить пользовательский конструктор (не важно, с параметрами или без них), то компилятор самостоятельно сгенерирует конструктор без параметров. Некоторые программисты явным образом задают конструктор по умолчанию по привычке, чтобы не забыть в дальнейшем, но это не обязательно В Java если производный класс не вызывает явным образом конструктор базового класса (в Java используя super() в первой строчке), то конструктор по умолчанию вызывается неявно. Если базовый класс не имеет конструктора по умолчанию, то это считается ошибкой.
559
560 1 Александр Александров
h3. Опишите метод Object.finalize().
561
562 5 Александр Александров
Метод Finalize(). Java обеспечивает механизм, который является аналогичным использованию деструкторов в С ++, который может использоваться для того, чтобы произвести процесс очистки перед возвращением управления операционной системе. Применяя метод Finalize(), можно определять специальные действия, которые будут выполняться тогда, когда объект будет использоваться сборщиком мусора. Данный метод вызывается при уничтожении объекта автоматическим сборщиком мусора (garbage collector). В классе Object он ничего не делает, однако в классе-наследнике позволяет описать все действия, необходимые для корректного удаления объекта, такие как закрытие соединений с БД, сетевых соединений, снятие блокировок на файлы и т.д. В обычном режиме напрямую этот метод вызывать не нужно, он отработает автоматически. Если необходимо, можно обратиться к нему явным образом.
563
564
Его синтаксис:
565
566
<pre>
567
protected void Finalize( ) throws Throwable
568
</pre>
569
570
Ссылки не являются собранным мусором; только объекты - собранный мусор
571
572 1 Александр Александров
h3. Чем отличаются слова final, finally и finalize?
573 5 Александр Александров
574
*Final* - Нельзя наследоваться от файнал класса. Нельзя переопределить файнал метод. Нельзя изменить сначение файнал поля.
575
*Finally* - используется при обработке ошибок, вызывается всегда, даже если произошла ошибка(кроме System.exit(0)). Удобно использовать для освобождения ресурсов.
576
*Finalize()* - вызывается перед тем как сборщик мусора будет проводить освобождение памяти. Не рекомендуется использовать для освобождения системных ресурсов, так как не известно когда сборщик мусора будет производить свою очистку. Вообще данный метод мало кто использует. Единственно что можно использовать этот метод для закрытия ресурса что должен работать на протяжении всей работы программы и закрываться по ее окончанию. Еще можно использовать метод для защиты от так называемых «дураков», проверять, освобождены ли ресурсы, если нет, то закрыть их.
577 1 Александр Александров
578
h3. Опишите иерархию исключений.
579
580 6 Александр Александров
Все классы-исключения расширяют класс Throwable - непосредственное расширение класса object.
581
У класса Throwable и у всех его расширений по традиции два конструктора:
582
583
* Throwable о - конструктор по умолчанию;
584
* Throwable (String message) - создаваемый объект будет содержать произвольное сообщение message.
585
586
Записанное в конструкторе сообщение можно получить затем методом getMessage (). Если объект создавался конструктором по умолчанию, то данный метод возвратит null.
587
Метод toString возвращает краткое описание события, именно он работал в предыдущих листингах.
588
589
Три метода выводят сообщения обо всех методах, встретившихся по пути "полета" исключения:
590
591
* printstackTrace() - выводит сообщения в стандартный вывод, как правило, это консоль;
592
* printStackTrace(PrintStream stream) - выводит сообщения в байтовый поток stream;
593
* printStackTrace(PrintWriter stream) - выводит сообщения в символьный поток stream.
594
595
У класса Throwable два непосредственных наследника - классы Error и Exception. Они не добавляют новых методов, а служат для разделения классов-исключений на два больших семейства - семейство классов-ошибок (error) и семейство собственно классов-исключений (exception). 
596
Классы-ошибки, расширяющие класс Error, свидетельствуют о возникновении сложных ситуаций в виртуальной машине Java. Их обработка требует глубокого понимания всех тонкостей работы JVM. Ее не рекомендуется выполнять в обычной программе. Не советуют даже выбрасывать ошибки оператором throw. He следует делать свои классы-исключения расширениями класса Error или какого то его подкласса.
597
Имена классов-ошибок, по соглашению, заканчиваются словом Error. 
598
Классы-исключения, расширяющие класс Exception, отмечают возникновение обычной нештатной ситуации, которую можно и даже нужно обработать. Такие исключения следует выбросить оператором throw. Классов-исключений очень много, более двухсот. Они разбросаны буквально по всем пакетам J2SDK. В большинстве случаев вы способны подобрать готовый класс-исключение для обработки исключительных ситуаций в своей программе. При желании можно создать и свой класс-исключение, расширив класс Exception или любой его подкласс. Среди классов-исключений выделяется класс RuntimeException - прямое расширение класса Exception. В нем и его подклассах отмечаются исключения, возникшие при работе JVM, но не столь серьезные, как ошибки. Их можно обрабатывать и выбрасывать, расширять своими классами, но лучше доверить это JVM, поскольку чаще всего это просто ошибка в программе, которую надо исправить. Особенность исключений данного класса в том, что их не надо отмечать в заголовке метода пометкой throws. Имена классов-исключений, по соглашению, заканчиваются словом Exception.
599
600 1 Александр Александров
h3. Какие виды исключений в Java вы знаете, чем они отличаются?
601
602 6 Александр Александров
Все исключительные ситуации можно разделить на две категории: проверяемые (checked) и непроверяемые (unchecked). Все исключения, порождаемые от Throwable, можно разбить на три группы. Они определяются тремя базовыми типами: наследниками Throwable - классами Errorи Exception, а также наследником Exception - RuntimeException.
603
Ошибки порожденные от Exception (и не являющиеся наследниками RuntimeException ), являются проверяемыми. Т.е. во время компиляции проверяется, предусмотрена ли обработка возможных исключительных ситуаций. Как правило, это ошибки, связанные с окружением программы (сетевым, файловым вводом-выводом и др.), которые могут возникнуть вне зависимости от того, корректно написан код или нет. Например, открытие сетевого соединения или файла может привести к возникновению ошибки и компилятор требует от программиста предусмотреть некие действия для обработки возможных проблем. Таким образом повышается надежность программы, ее устойчивость при возможных сбоях. 
604
Исключения, порожденные от RuntimeException, являются непроверяемыми и компилятор не требует обязательной их обработки. 
605
Как правило, это ошибки программы, которые при правильном кодировании возникать не должны (например, IndexOutOfBoundsException- выход за границы массива, java.lang.ArithmeticException- деление на ноль). Поэтому, чтобы не загромождать программу, компилятор оставляет на усмотрение программиста обработку таких исключений с помощью блоков try-catch. 
606
Исключения, порожденные от Error, также не являются проверяемыми. Они предназначены для того, чтобы уведомить приложение о возникновении фатальной ситуации, которую программным способом устранить практически невозможно (хотя формально обработчик допускается). Они могут свидетельствовать об ошибках программы, но, как правило, это неустранимые проблемы на уровне JVM. В качестве примера можно привести StackOverÚowError (переполнение стека), OutOfMemoryError (нехватка памяти). 
607
Методы, код которых может порождать проверяемые исключения, должны либо сами их обрабатывать, либо в заголовке метода должно быть указано ключевое слово throws с перечислением необрабатываемых проверяемых исключений. На непроверяемые ошибки это правило не распространяется. 
608
Переопределенный (overridden) метод не может расширять список возможных исключений исходного метода.
609
610 1 Александр Александров
h3. Что такое checked и unchecked Exception?
611
612 6 Александр Александров
Checked исключения, это те, которые должны обрабатываться блоком catch или описываться в сигнатуре метода. Unchecked могут не обрабатываться и не быть описанными. Unchecked исключения в Java - наследованные от RuntimeException, Checked - от Exception. Пример unchecked исключения - NullPointerException, checked исключения - IOException.
613
614 1 Александр Александров
h3. Как создать свой unchecked Exception?
615
616 6 Александр Александров
Унаследоваться от RuntimeException.
617
618 1 Александр Александров
h3. Какие есть Unchecke exeption?
619
620 6 Александр Александров
{{dmsf_image(197)}}
621
622 1 Александр Александров
h3. Что такое Error?
623
624 6 Александр Александров
Исключения, порожденные от Error, не являются проверяемыми. Они предназначены для того, чтобы уведомить приложение о возникновении фатальной ситуации, которую программным способом устранить практически невозможно (хотя формально обработчик допускается). Они могут свидетельствовать об ошибках программы, но, как правило, это неустранимые проблемы на уровне JVM. В качестве примера можно привести StackOverÚowError (переполнение стека), OutOfMemoryError (нехватка памяти).
625
Методы, код которых может порождать проверяемые исключения, должны либо сами их обрабатывать, либо в заголовке метода должно быть указано ключевое слово throws с перечислением необрабатываемых проверяемых исключений. На непроверяемые ошибки это правило не распространяется.
626
627 1 Александр Александров
h3. Опишите работу блока try-catch-finally.
628 6 Александр Александров
629 7 Александр Александров
Если срабатывает один из блоков catch, то остальные блоки в данной конструкции trycatch выполняться не будут. Свойством транзакционности исключения не обладают - действия, произведенные в блоке try до возникновения исключения, не отменяются поcле его возникновения.
630 1 Александр Александров
631
h3. Возможно ли использование блока try-finally (без catch)?
632
633 7 Александр Александров
try может быть в паре с finally, без catch. Работает это точно так же - после выхода из блока try выполняется блок finally. Это может быть полезно, например, в следующей ситуации. При выходе из метода вам надо произвести какое-либо действие. А return в этом методе стоит в нескольких местах. Писать одинаковый код перед каждым return нецелесообразно. Гораздо проще и эффективнее поместить основной код в try, а код, выполняемый при выходе - в finally.
634
635 1 Александр Александров
h3. Всегда ли исполняется блок finally?
636
637 7 Александр Александров
Не всегда например в следующих ситуациях:
638
# Существуют потоки-демоны - потоки предоставляющие некие сервисы, работая в фоновом режиме во время выполнения программы, но при этом не являются ее неотъемлеммой частью.Таким образом когда все потоки не демоны завершаются, программа завершает свою работу. В потоках демонах блок finally не выполняеться, они прерываются внезапно.
639
# System.exit(0)
640
# если в блоке finally произошло исключение и нет обработчика, то оставшийся код в блоке finally может не выполнятся.
641
642 1 Александр Александров
h3. Какие есть особенности класса String? что делает метод intern().
643
644 7 Александр Александров
# Внутреннее состояние класса String нельзя изменить после его создания, т.е. этот класс неизменяемый (immutable) поэтому когда вы пишете String str = "One" + "Two"; создается три! объекта класса String.
645
# От него нельзя унаследоваться, потому что класс String объявлен как final: public final class String
646
# Метод hashCode класса String переписан и возвращает: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
647
# У класса String есть метод public String intern(), который возвращает строку в каноническом ее представлении из внутреннего пула строк, поддерживаемого JVM, он нужен чтобы вместо String.equals() использовать ==.
648
649
Понятно, что оператор сравнения ссылок выполняется гораздо быстрее, чем посимвольное сравнение строк. Используют в основном, где приходится сравнивать много строк, например в каких нибудь XML парсерах. А вообще по увеличению производительности ещё вопрос. Ибо метод intern() тогда должен выполняться быстрее чем equals(), каждый раз когда вы вызываете метод intern() просматривается пул строк на наличие такой строки и если такая уже есть в пуле, то возвращается ссылка на нее.Сравниваются они через equal().
650
651 1 Александр Александров
h3. Можно ли наследовать строковый тип, почему?
652
653 7 Александр Александров
Классы объявлены final, поэтому наследоваться не получится.
654
655 1 Александр Александров
h3. Почему строка является популярным ключом в HashMap в Java?
656
657 7 Александр Александров
Поскольку строки неизменны, их хэшкод кэшируется в момент создания, и не требует повторного пересчета. Это делает строки отличным кандидатом для ключа в Map и они обрабатываются быстрее, чем другие объекты-ключи HashMap. Вот почему строки преимущественно используются в качестве ключей HashMap.
658
659 1 Александр Александров
h3. Дайте определение понятию конкатенация строк.
660
661 7 Александр Александров
Конкатенация - операция объединения строк. Результатом является объединения второй строки с окончанием первой. Операция конкатенации могут быть выполнены так:
662
663
<pre><code class="java">
664
StringBuffer stringBuffer = new StringBuffer();
665
StringBuilder stringBuilder = new StringBuilder();
666
String str = "ABC";
667
668
str += "DEF";
669
String str2 = "one".concat("two").concat("three");
670
stringBuffer.append("DDD").append("EEE");
671
stringBuilder.append("FFF").append("GGG");
672
673
System.out.println(str);//ABCDEF
674
System.out.println(str2);//onetwothree
675
System.out.println(stringBuffer.toString());//DDDEEE
676
System.out.println(stringBuilder.toString());//FFFGGG
677
</code></pre>
678
679 1 Александр Александров
h3. Как перевернуть строку?
680
681 7 Александр Александров
Один из способов как это можно сделать:
682
683
<pre><code class="java">
684
String s = "ABCDEFG";
685
StringBuilder stringBuilder = new StringBuilder(s);
686
stringBuilder.reverse();
687
System.out.println(stringBuilder.toString());//GFEDCBA
688
</code></pre>
689
690 1 Александр Александров
h3. Как сравнить значение двух строк?
691
692 7 Александр Александров
Строка в Java - это отдельный объект, который может не совпадать с другим объектом, хотя на экране результат выводимой строки может выглядеть одинаково. Оператор == (а также !=) работает с ссылками объекта String. Если две переменные String указывают на один и тот же объект в памяти, сравнение вернет результат true. В противном случае результат будет false, несмотря на то что текст может содержать в точности такие же символы. Для сравнения посимвольно на эквивалентность необходимо использовать метод equals().
693
694
<pre><code class="java">
695
String s1 = new String("ABC");
696
String s2 = new String("ABC");
697
String s3 = "ABC";
698
String s4 = "ABC";
699
700
System.out.println(s1 == s2); // false
701
System.out.println(s3 == s4); // true. Так как один набор литералов будет указывать на одну область памяти.
702
System.out.println(s1.equals(s2)); // true.
703
704
s1 = s2;
705
System.out.println(s1 == s2); //true
706
if ("someString" == "someString") { //true
707
    System.out.println("true");
708
}
709
</code></pre>
710
711 1 Александр Александров
h3. Как обрезать пробелы в начале и конце строки?
712
713 7 Александр Александров
Небольшой пример:
714
715
<pre><code class="java">
716
String s = "    a    ";
717
System.out.println(s.trim() + "b");//ab
718
System.out.println(s + "b");//    a    b
719
</code></pre>
720
721 1 Александр Александров
h3. Дайте определение понятию "пул строк".
722
723 7 Александр Александров
Пул строк - это набор строк, который хранится в памяти Java heap. Мы знаем, что String это специальный класс в Java, и мы можем создавать объекты этого класса, используя оператор new точно так же, как и создавать объекты, предоставляя значение строки в двойных кавычках. Диаграмма ниже объясняет, как пул строк размещается в памяти Java heap и что происходит, когда мы используем различные способы создания строк.
724
725
{{dmsf_image(198)}}
726
727
Пул строк возможен исключительно благодаря неизменяемости строк в Java и реализации идеи интернирования строк. Пул строк помогает экономить большой объем памяти, но с другой стороны создание
728
 строки занимает больше времени. Когда мы используем двойные кавычки для создания строки, сначала ищется строка в пуле с таким же значением, если находится, то просто возвращается ссылка, иначе создается новая строка в пуле, а затем возвращается ссылка. Тем не менее, когда мы используем оператор new, мы принуждаем класс String создать новый объект строки, а затем мы можем использовать метод intern() для того, чтобы поместить строку в пул, или получить из пула ссылку на другой объект String с таким же значением.
729
730 1 Александр Александров
h3. Можно ли синхронизировать доступ к строке?
731
732 7 Александр Александров
String сам по себе потокобезопасный класс. Если мы мы работаем с изменяемыми строками, то нужно использовать StringBuffer.
733
734 1 Александр Александров
h3. Как правильно сравнить значения строк двух различных объектов типа String и StringBuffer?
735
736 7 Александр Александров
Привести их к одному типу и сравнить.
737
738 1 Александр Александров
h3. Почему строка неизменная и финализированная в Java?
739
740 7 Александр Александров
Есть несколько преимуществ в неизменности строк:
741
742
* Строковый пул возможен только потому, что строка неизменна в Java, таким образом виртуальная машина сохраняет много места в памяти(heap space), поскольку разные строковые переменные указывают на одну переменную в пуле. Если бы строка не была неизмененяемой, тогда бы интернирование строк не было бы возможным, потому что если какая-либо переменная изменит значение, это отразится также и на остальных переменных, ссылающихся на эту строку.
743
* Если строка будет изменяемой, тогда это станет серьезной угрозой безопасности приложения. Например, имя пользователя базы данных и пароль передаются строкой для получения соединения с базой данных и в программировании сокетов реквизиты хоста и порта передаются строкой. Так как строка неизменяемая, её значение не может быть изменено, в противном случае любой хакер может изменить значение ссылки и вызвать проблемы в безопасности приложения.
744
* Строки используются в Java classloader и неизменность обеспечивает правильность загрузки класса при помощи Classloader. К примеру, задумайтесь об экземпляре класса, когда вы пытаетесь загрузить java.sql.Connection класс, но значение ссылки изменено на myhacked.Connection класс, который может осуществить нежелательные вещи с вашей базой данных.
745
* Поскольку строка неизменная, её hashcode кэшируется в момент создания и нет необходимости рассчитывать его снова. Это делает строку отличным кандидатом для ключа в Map и его обработка будет быстрее, чем других ключей HashMap. Это причина, почему строка наиболее часто используемый объект, используемый в качестве ключа HashMap.
746
747 1 Александр Александров
h3. Напишите метод удаления данного символа из строки.
748
749 7 Александр Александров
Мы можем использовать метод replaceAll для замены всех вхождений в строку другой строкой. Обратите внимание на то, что метод получает в качестве аргумента строку, поэтому мы используем класс Character для создания строки из символа, и используем её для замены всех символов на пустую строку.
750
751
<pre><code class="java">
752
public static String removeChar(String str, char ch) {
753
    return str == null ? null : str.replaceAll(Character.toString(ch), "");
754
}
755
</code></pre>
756
757
758 1 Александр Александров
h3. Что такое рефлексия?
759
760 7 Александр Александров
Рефлексия используется для получения или модификации информации о типах во время выполнения программы. Этот механизм позволяет получить сведения о классах, интерфейсах, полях, методах, конструкторах во время исполнения программы. При этом не нужно знать имена классов, методов или интерфейсов. Также этот механизм позволяет создавать новые объекты, выполнять методы и получать и устанавливать значения полей.
761
762 1 Александр Александров
h3. Что произойдет со сборщиком мусора (GC), если во время выполнения метода finalize() некоторого объекта произойдет исключение?
763
764 7 Александр Александров
Во время старта JVM запускается поток finalizer, который работает в фоне. Этот поток имеет метод runFinalizer, который игнорирует все исключения методов finalize объектов перед сборкой мусора.
765
То есть если во время выполнения метода finalize возникнет исключительная ситуация, его выполнение будет остановлено и это никак не скажется на работоспособности самого сборщика мусора (garbage collector).
766
767 1 Александр Александров
h3. Что такое интернационализация, локализация?
768
769 7 Александр Александров
Интернационализация (internationalization, а для краткости - i18n) - такой способ создания приложений, при котором их можно легко адаптировать для разных аудиторий, говорящих на разных языках.
770
Локализацияlocalization а для краткости - l10n) - адаптация интерфейса приложения под несколько языков. Добавление нового языка может внести определенные сложности в локализацию интерфейса.
771
772 1 Александр Александров
h3. Что такое Аннотации в Java?
773
774 7 Александр Александров
Аннотации - это своего рода метатеги, которые добавляются к коду и применяются к объявлению пакетов, классов, конструкторов, методов, полей, параметров и локальных переменных. Аннотации всегда обладают некоторой информацией и связывают эти "дополнительные данные" и все перечисленные конструкции языка. Фактически аннотации представляют собой их дополнительные модификаторы, применение которых не влечет за собой изменений ранее созданного кода.
775
776 1 Александр Александров
h3. Какие функции выполняет Аннотации?
777
778 7 Александр Александров
Аннотация выполняет следующие функции:
779
780
# дает необходимую информацию для компилятора;
781
# дает информацию различным инструментам для генерации другого кода, конфигураций и т. д.;
782
# может использоваться во время работы кода;
783
784
Самая часто встречаемая аннотация, которую встречал любой программист, даже начинающий это @Override.
785
786 1 Александр Александров
h3. Какие встроенные аннотации в Java вы знаете?
787
788 7 Александр Александров
В языке Java SE определено несколько встроенных аннотаций, большинство из их являются специализированными. Четыре типа @Retention, @Documented, @Target и @Inherited - из пакета java.lang.annotation.
789
Из оставшиеся выделяются - @Override, @Deprecated, @SafeVarargs и @SuppressWarnings - из пакета java.lang. Широкое использование аннотаций в различных технологиях и фреймворках обуславливается возможностью сокращения кода и снижения его связанности
790
791 1 Александр Александров
h3. Что делают аннотации @Retention, @Documented, @Target и @Inherited?
792
793 7 Александр Александров
Эти аннотации, имеют следующее значение:
794
795
* @Retention - эта аннотация предназначена для применения только в качестве аннотации к другим аннотациям, позволяет указать жизненный цикл аннотации: будет она присутствовать только в исходном коде, в скомпилированном файле, или она будет также видна и в процессе выполнения. Выбор нужного типа зависит от того, как вы хотите использовать аннотацию.
796
* @Documented - это маркер-интерфейс, который сообщает инструменту, что аннотация должна быть документирована.
797
* @Target - эта аннотация задает тип объявления, к которым может быть применима аннотация. Принимает один аргумент, который должен быть константой из перечисления ElementType, это может быть поле, метод, тип и т.д. Например, чтобы указать, что аннотация применима только к полям и локальным переменным:
798
* @Targer({ ElementType.FIELD, ElementTyle.LOCAL_VARIABLE } )
799
* @Inherited - это аннотация-маркер, которая может применяться в другом объявление аннотации, она касается только тех аннотаций, что будут использованы в объявлениях классов. Эта аннотация позволяет аннотации супер класса быть унаследованной в подклассе.
800
801 1 Александр Александров
h3. Что делают аннотации @Override, @Deprecated, @SafeVarargs и @SuppressWarnings?
802
803 7 Александр Александров
Эти аннотации предназначены для:
804
805
* @Override - аннотация-маркер, которая может применяться только к методам. Метод, аннотированный как @Override, должен переопределять метод супер класса.
806
* @Deprecated - указывает, что объявление устарело и должно быть заменено более новой формой.
807
* @SafeVarargs - аннотация-маркер, применяется к методам и конструкторам. Она указывает, что никакие небезопасные действия, связанные с параметром переменного количества аргументов, недопустимы. Применяется только к методам и конструкторам с переменным количеством аргументов, которые объявлены как static или final.
808
* @SuppressWarnings - эта аннотация указывает, что одно или более предупреждений, которые могут быть выданы компилятором следует подавить.
809
810 1 Александр Александров
h3. Какой жизненный цикл аннотации можно указать с помощью @Retention?
811
812 7 Александр Александров
Существует 3 возможные варианты чтобы указать где аннотация будет жить. Они инкапсулированы в перечисление java.lang.annotation.RetentionPolicy. Это SOURCE, RUNTIME.
813
814
* SOURCE - содержаться только в исходном файле и отбрасываются при компиляции.
815
* CLASS - сохраняются в файле, однако они недоступны JVM во время выполнения.
816
* RUNTIME - сохраняются в файле во время компиляции и остаются доступными JVM во время выполнения.
817
818 1 Александр Александров
h3. К каким элементам можно применять аннотацию, как это указать?
819
820 7 Александр Александров
Для того чтобы ограничить использование аннотации её нужно проаннотировать. Для этого существует аннотация @Target.
821
822
* @Target(ElementType.PACKAGE) - только для пакетов;
823
* @Target(ElementType.TYPE) - только для классов;
824
* @Target(ElementType.CONSTRUCTOR) - только для конструкторов;
825
* @Target(ElementType.METHOD) - только для методов;
826
* @Target(ElementType.FIELD) - только для атрибутов(переменных) класса;
827
* @Target(ElementType.PARAMATER) - только для параметров метода;
828
* @Target(ElementType.LOCAL_VARIABLE) - только для локальных переменных.
829
830
В случае если вы хотите, что бы ваша аннотация использовалась больше чем для одного типа параметров, то можно указать @Target следующим образом:
831
832
<pre>
833
@Target({ ElementType.PARAMETER, ElementType.LOCAL_VARIABLE })
834
</pre>
835
836
тут мы говорим, аннотацию можно использовать только для параметров метода и для локальных переменных.
837
838 1 Александр Александров
h3. Как создать свою Аннотацию?
839
840 7 Александр Александров
Написать свою аннотацию не так сложно, как могло бы казаться. В следующем коде приведено объявление аннотации.
841
842
public @interface About {
843
    String info() default "";
844
}
845
846
как вы видите на месте где обычно пишут class или interface у нас написано @interface.
847
848
Структура практически та же, что и у интерфейсов, только пишется @interface.
849
850
* @interface - указывает на то, что это аннотация
851
* default - говорит про то, что метод по умолчанию будет возвращать определённое значение.
852
853
Аннотация готова теперь ею можно пользоваться, также аннотацию можно сконфигурировать.
854
855 1 Александр Александров
h3. Атрибуты каких типов допустимы в аннотациях?
856
857 7 Александр Александров
Атрибуты могут иметь только следующие типы:
858
859
* String
860
* Class или «any parameterized invocation of Class
861
* enum
862
* annotation
863
* массив элементов любого из вышеперечисленных типов
864
865
Последний пункт надо понимать как то, что допустимы только одномерные массивы.
866
867 1 Александр Александров
h3. Что такое JMX?
868
869 7 Александр Александров
Управленческие расширения Java (Java Management Extensions, JMX) - API при помощи которого можно контролировать работу приложений и управлять различными параметрами удаленно в реальном времени. Причем управлять можно фактически чем угодно - лишь бы это было написано на Java. Это может быть микро-устройство типа считывателя отпечатка или система, включающая тысячи машин, каждая из которых предоставляет определенные сервисы. Данные ресурсы представляются MBeanобъектами (управляемый Java Bean). JMX вошла в поставку Java начиная с версии 5.
870
871 1 Александр Александров
h3. Какие выгоды предлагает JMX?
872
873 7 Александр Александров
Вот как эти выгоды описывает Sun
874
* Простота реализации. Архитектура JMX основана на понятии "сервера управляемых объектов" который выступает как управляющий агент и может быть запущен на многих устройствах/компьютерах, которые поддерживают JAVA.
875
* Масштабируемость. Службы агентов JXM являются независимыми и могут быть встроены наподобие plug-in’ов в агента JMX. Компонентно-основанаая система позволяет создавать масштабируемые решения от крохотных устройств до очень крупных систем.
876
* Возможность расширять концепцию в будущем. JMX позволяет создавать гибкие решения. Например, JMX позволяет создавать удобные решения, которые могут находить различные сервисы.
877
* Концентрация на управлении. JMX предоставляет сервися, разработанные для работы в распределенных средах и его API спроектировано для решений, которые управляют приложениями, сетями, сервисами и т.д.
878
879 1 Александр Александров
h3. Что еще умеет JMX кроме дистанционного управления?
880
881 7 Александр Александров
JMX делает гораздо больше, чем просто предоставляет рабочую оболочку для дистанционного управления. Она обеспечивает дополнительные услуги (services), способные занять ключевое место в процессе разработки. Приведу лишь краткое описание:
882
883
* Интерфейсы оповещают исполнителей и слушателей о событиях типа изменения атрибута, что позволяет MBean-компонентам общаться с другими MBean-компонентами или удалённым "командным пунктом" и докладывать об изменениях своего состояния
884
* Monitor service: Monitor MBeans может посылать уведомления о событиях зарегистрированным слушателям. Слушателем может выступать другой MBean или управляющее приложение. В качестве основных атрибутов, для которых используется данное свойство, являются counter, gauge или string.
885
* Timer service: Timer MBean будет посылать уведомления зарегистрированным слушателям, с учётом определённого числа или временного промежутка.
886
* M-let service: М-let service может создавать и регистрировать экземпляры MBean-серверов. Список MBean-компонентов и имён из классов определяются в m-let-файле с помощью MLET -меток. URL указывает на месторасположения m-let-файла.
887
888 1 Александр Александров
h3. Что такое MBean?
889
890 7 Александр Александров
MBeans - это Java-объекты, которые реализуют определенный интерфейс. Интерфейс включает:
891
892
# некие величины, которые могут быть доступны;
893
# операции, которые могут быть вызваны;
894
# извещения, которые могут быть посланы;
895
# конструкторы
896
897 1 Александр Александров
h3. Какие типы MBeans существуют?
898
899 7 Александр Александров
Существует 4 типа MBeans:
900
* Standard MBeans. Самые простые бины. Их управляющий интерфейс определяется набором методов
901
* Dynamic MBeans. Они реализуют специализированный интерфейс, который делают доступным во время исполнения.
902
* Open MBeans. Это Dynamic MBeans, которые используют только основные типы данных для универсального управления.
903
* Model MBeans. Это Dynamic MBeans, которые полностью конфигурируемы и могут показать свое описание во время исполнения (нечто вроде Reflection)
904
905 1 Александр Александров
h3. Что такое MBean Server?
906
907 7 Александр Александров
MBean Server - это реестр объектов, которые используются для управления. Любой объект зарегистрированный на сервере становится доступным для приложений. Надо отметить, что сервер публикует только интерфейсы и не дает прямых ссылок на объекты. Любые ресурсы, которыми вы хотите управлять должны быть зарегистрированы на сервере как MBean. Сервер предоставляет стандартный интерфейс для доступа к MBean. Интересно, что регистрировать MBean может любой другой MBean, сам агент или удаленное приложение через распределенные сервисы. Когда вы регистрируете MBean вы должны дать ему уникальное имя, которое будет использовано для обращения к даному объекту.
908
909 1 Александр Александров
h3. Какие механизмы обеспечивают безопасность в технологии Java?
910
911 7 Александр Александров
В технологии Java безопасность обеспечивают следующие три механизма:
912
913
* структурные функциональные возможности языка (например, проверка границ массивов, запрет на преобразования непроверенных типов, отсутствие указателей и т.д.).
914
* средства контроля доступа, определяющие действия, которые разрешается или запрещается выполнять в коде (например, может ли код получать доступ к файлам, передавать данные по сети и т.д.).
915
* механизм цифровой подписи, предоставляющий авторам возможность применять стандартные алгоритмы для аутентификации своих программ, а пользователям - точно определять, кто создал код и изменился ли он с момента его подписания.
916
917 1 Александр Александров
h3. Назовите несколько видов проверок которые выполняет верификатор байт-кода Java?
918
919 7 Александр Александров
Ниже приведены некоторые виды проверок, выполняемых верификатором.
920
921
* инициализация переменных перед их использованием.
922
* согласование типов ссылок при вызове метода.
923
* соблюдение правил доступа к закрытым данным и методам.
924
* доступ к локальным переменным в стеке во время выполнения.
925
* отсутствие переполнения стека.
926
927
При невыполнении какой-нибудь из этих проверок класс считается поврежденным и загружаться не будет.
928
929 1 Александр Александров
h3. Что вы знаете о "диспетчере защиты" в Java?
930
931 7 Александр Александров
В качестве диспетчера защиты служит класс, определяющий, разрешено ли коду выполнять ту или иную операцию. Ниже перечислены операции, подпадающие под контроль диспетчера защиты. Существует немало других проверок, выполняемых диспетчером защиты в библиотеке Java.
932
933
* создание нового загрузчика классов.
934
* выход из виртуальной машины.
935
* получение доступа к члену другого класса с помощью рефлексии.
936
* получение доступа к файлу.
937
* установление соединения через сокет.
938
* запуск задания на печать.
939
* получение доступа к системному буферу обмена.
940
* получение доступа к очереди событий в AWT.
941
* обращение к окну верхнего уровня
942
943 1 Александр Александров
h3. Что такое JAAS?
944
945 7 Александр Александров
JAAS (Java Authentication and Authorization Service - служба аутентификации и авторизации Java ) - служба JAAS, по существу, представляет собой встраиваемый прикладной интерфейс API, отделяющий прикладные программы на Java от конкретной технологии, применяемой для реализации средств аутентификации. Помимо прочего, эта служба поддерживает механизмы регистрации в UNIX и NT, механизм аутентификации Kerberos и механизмы аутентификации по сертификатам. После аутентификации за пользователем может быть закреплен определенный набор полномочий. Входит в состав платформы Java начиная с версии Java SE 1.4.
946
947 1 Александр Александров
h3. Что такое Рефакторинг?
948 7 Александр Александров
949
Рефакторинг - процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы. В основе рефакторинга лежит последовательность небольших эквивалентных (то есть сохраняющих поведение) преобразований.
Go to top