JAVA CORE » История » Версия 3
Александр Александров, 19.04.2019 00:29
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 | class AbstractTableModel implements TableModel { |
||
128 | } |
||
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 | h3. Модификатор доступа |
||
359 | |||
360 | h3. Возвращаемый тип |
||
361 | |||
362 | h3. Тип аргумента или количество |
||
363 | |||
364 | h3. Имя аргументов |
||
365 | |||
366 | h3. Изменять порядок, количество или вовсе убрать секцию throws? |
||
367 | |||
368 | h3. Что такое autoboxing? |
||
369 | |||
370 | h3. Что такое Generics? |
||
371 | |||
372 | h3. Какова истинная цель использования обобщенных типов в Java? |
||
373 | |||
374 | h3. Каким образом передаются переменные в методы, по значению или по ссылке? |
||
375 | |||
376 | h3. Какие методы есть у класса Object? |
||
377 | |||
378 | h3. Правила переопределения метода Object.equals(). |
||
379 | |||
380 | h3. Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода? |
||
381 | |||
382 | h3. Какая связь между hashCode и equals? |
||
383 | |||
384 | h3. Каким образом реализованы методы hashCode и equals в классе Object? |
||
385 | |||
386 | h3. Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы? |
||
387 | |||
388 | h3. Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode? |
||
389 | |||
390 | h3. Для чего нужен метод hashCode()? |
||
391 | |||
392 | h3. Правила переопределения метода Object.hashCode(). |
||
393 | |||
394 | h3. Расскажите про клонирование объектов. В чем отличие между поверхностным и глубоким клонированием? |
||
395 | |||
396 | h3. Правила переопределения метода Object.clone(). |
||
397 | |||
398 | h3. Где и как вы можете использовать закрытый конструктор? |
||
399 | |||
400 | h3. Что такое конструктор по умолчанию? |
||
401 | |||
402 | h3. Опишите метод Object.finalize(). |
||
403 | |||
404 | h3. Чем отличаются слова final, finally и finalize? |
||
405 | |||
406 | h3. Опишите иерархию исключений. |
||
407 | |||
408 | h3. Какие виды исключений в Java вы знаете, чем они отличаются? |
||
409 | |||
410 | h3. Что такое checked и unchecked Exception? |
||
411 | |||
412 | h3. Как создать свой unchecked Exception? |
||
413 | |||
414 | h3. Какие есть Unchecke exeption? |
||
415 | |||
416 | h3. Что такое Error? |
||
417 | |||
418 | h3. Опишите работу блока try-catch-finally. |
||
419 | |||
420 | h3. Возможно ли использование блока try-finally (без catch)? |
||
421 | |||
422 | h3. Всегда ли исполняется блок finally? |
||
423 | |||
424 | h3. Какие есть особенности класса String? что делает метод intern(). |
||
425 | |||
426 | h3. Можно ли наследовать строковый тип, почему? |
||
427 | |||
428 | h3. Почему строка является популярным ключом в HashMap в Java? |
||
429 | |||
430 | h3. Дайте определение понятию конкатенация строк. |
||
431 | |||
432 | h3. Как перевернуть строку? |
||
433 | |||
434 | h3. Как сравнить значение двух строк? |
||
435 | |||
436 | h3. Как обрезать пробелы в начале и конце строки? |
||
437 | |||
438 | h3. Дайте определение понятию "пул строк". |
||
439 | |||
440 | h3. Можно ли синхронизировать доступ к строке? |
||
441 | |||
442 | h3. Как правильно сравнить значения строк двух различных объектов типа String и StringBuffer? |
||
443 | |||
444 | h3. Почему строка неизменная и финализированная в Java? |
||
445 | |||
446 | h3. Напишите метод удаления данного символа из строки. |
||
447 | |||
448 | h3. Что такое рефлексия? |
||
449 | |||
450 | h3. Что произойдет со сборщиком мусора (GC), если во время выполнения метода finalize() некоторого объекта произойдет исключение? |
||
451 | |||
452 | h3. Что такое интернационализация, локализация? |
||
453 | |||
454 | h3. Что такое Аннотации в Java? |
||
455 | |||
456 | h3. Какие функции выполняет Аннотации? |
||
457 | |||
458 | h3. Какие встроенные аннотации в Java вы знаете? |
||
459 | |||
460 | h3. Что делают аннотации @Retention, @Documented, @Target и @Inherited? |
||
461 | |||
462 | h3. Что делают аннотации @Override, @Deprecated, @SafeVarargs и @SuppressWarnings? |
||
463 | |||
464 | h3. Какой жизненный цикл аннотации можно указать с помощью @Retention? |
||
465 | |||
466 | h3. К каким элементам можно применять аннотацию, как это указать? |
||
467 | |||
468 | h3. Как создать свою Аннотацию? |
||
469 | |||
470 | h3. Атрибуты каких типов допустимы в аннотациях? |
||
471 | |||
472 | h3. Что такое JMX? |
||
473 | |||
474 | h3. Какие выгоды предлагает JMX? |
||
475 | |||
476 | h3. Что еще умеет JMX кроме дистанционного управления? |
||
477 | |||
478 | h3. Что такое MBean? |
||
479 | |||
480 | h3. Какие типы MBeans существуют? |
||
481 | |||
482 | h3. Что такое MBean Server? |
||
483 | |||
484 | h3. Какие механизмы обеспечивают безопасность в технологии Java? |
||
485 | |||
486 | h3. Назовите несколько видов проверок которые выполняет верификатор байт-кода Java? |
||
487 | |||
488 | h3. Что вы знаете о "диспетчере защиты" в Java? |
||
489 | |||
490 | h3. Что такое JAAS? |
||
491 | |||
492 | h3. Что такое Рефакторинг? |