JAVA CORE » История » Версия 2
Александр Александров, 18.04.2019 16:28
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 | String - неизменяемый класс, тоесть для для добавление данных в уже существующую строку, создается новый объект строки. StringBuffer и StringBuilder могут изменятся и добавление строки не такое дорогостоющее с точки зрения памяти. Первы - синхронизированный, второй - нет. Это их единственное различие. Правда если нам нужно сделать подстроку строки, то лучше использовать String, так как ее массив символов не меняется и не создается заново для новой строки. А вот в StringBuffer и StringBuilder для создания подстроки создается новый массив символов. |
||
239 | 1 | Александр Александров | |
240 | h3. Расскажите про потоки ввода-вывода Java. |
||
241 | |||
242 | h3. Что такое Heap и Stack память в Java? |
||
243 | |||
244 | h3. Какая разница между Stack и Heap памятью в Java? |
||
245 | |||
246 | h3. Расскажите про модель памяти в джава? |
||
247 | |||
248 | h3. Как работает сборщик мусора (garbage collector)? |
||
249 | |||
250 | h3. Расскажите про приведение типов. Что такое понижение и повышение типа? Когда вы получаете ClassCastException? |
||
251 | |||
252 | h3. Что такое статический класс, какие особенности его использования? |
||
253 | |||
254 | h3. Каким образом из вложенного класса получить доступ к полю внешнего класса. |
||
255 | |||
256 | h3. Какие существуют типы вложенных классов? Для чего они используются? |
||
257 | |||
258 | h3. Возможно ли при переопределении (override) метода изменить: |
||
259 | |||
260 | h3. Модификатор доступа |
||
261 | |||
262 | h3. Возвращаемый тип |
||
263 | |||
264 | h3. Тип аргумента или количество |
||
265 | |||
266 | h3. Имя аргументов |
||
267 | |||
268 | h3. Изменять порядок, количество или вовсе убрать секцию throws? |
||
269 | |||
270 | h3. Что такое autoboxing? |
||
271 | |||
272 | h3. Что такое Generics? |
||
273 | |||
274 | h3. Какова истинная цель использования обобщенных типов в Java? |
||
275 | |||
276 | h3. Каким образом передаются переменные в методы, по значению или по ссылке? |
||
277 | |||
278 | h3. Какие методы есть у класса Object? |
||
279 | |||
280 | h3. Правила переопределения метода Object.equals(). |
||
281 | |||
282 | h3. Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода? |
||
283 | |||
284 | h3. Какая связь между hashCode и equals? |
||
285 | |||
286 | h3. Каким образом реализованы методы hashCode и equals в классе Object? |
||
287 | |||
288 | h3. Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы? |
||
289 | |||
290 | h3. Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode? |
||
291 | |||
292 | h3. Для чего нужен метод hashCode()? |
||
293 | |||
294 | h3. Правила переопределения метода Object.hashCode(). |
||
295 | |||
296 | h3. Расскажите про клонирование объектов. В чем отличие между поверхностным и глубоким клонированием? |
||
297 | |||
298 | h3. Правила переопределения метода Object.clone(). |
||
299 | |||
300 | h3. Где и как вы можете использовать закрытый конструктор? |
||
301 | |||
302 | h3. Что такое конструктор по умолчанию? |
||
303 | |||
304 | h3. Опишите метод Object.finalize(). |
||
305 | |||
306 | h3. Чем отличаются слова final, finally и finalize? |
||
307 | |||
308 | h3. Опишите иерархию исключений. |
||
309 | |||
310 | h3. Какие виды исключений в Java вы знаете, чем они отличаются? |
||
311 | |||
312 | h3. Что такое checked и unchecked Exception? |
||
313 | |||
314 | h3. Как создать свой unchecked Exception? |
||
315 | |||
316 | h3. Какие есть Unchecke exeption? |
||
317 | |||
318 | h3. Что такое Error? |
||
319 | |||
320 | h3. Опишите работу блока try-catch-finally. |
||
321 | |||
322 | h3. Возможно ли использование блока try-finally (без catch)? |
||
323 | |||
324 | h3. Всегда ли исполняется блок finally? |
||
325 | |||
326 | h3. Какие есть особенности класса String? что делает метод intern(). |
||
327 | |||
328 | h3. Можно ли наследовать строковый тип, почему? |
||
329 | |||
330 | h3. Почему строка является популярным ключом в HashMap в Java? |
||
331 | |||
332 | h3. Дайте определение понятию конкатенация строк. |
||
333 | |||
334 | h3. Как перевернуть строку? |
||
335 | |||
336 | h3. Как сравнить значение двух строк? |
||
337 | |||
338 | h3. Как обрезать пробелы в начале и конце строки? |
||
339 | |||
340 | h3. Дайте определение понятию "пул строк". |
||
341 | |||
342 | h3. Можно ли синхронизировать доступ к строке? |
||
343 | |||
344 | h3. Как правильно сравнить значения строк двух различных объектов типа String и StringBuffer? |
||
345 | |||
346 | h3. Почему строка неизменная и финализированная в Java? |
||
347 | |||
348 | h3. Напишите метод удаления данного символа из строки. |
||
349 | |||
350 | h3. Что такое рефлексия? |
||
351 | |||
352 | h3. Что произойдет со сборщиком мусора (GC), если во время выполнения метода finalize() некоторого объекта произойдет исключение? |
||
353 | |||
354 | h3. Что такое интернационализация, локализация? |
||
355 | |||
356 | h3. Что такое Аннотации в Java? |
||
357 | |||
358 | h3. Какие функции выполняет Аннотации? |
||
359 | |||
360 | h3. Какие встроенные аннотации в Java вы знаете? |
||
361 | |||
362 | h3. Что делают аннотации @Retention, @Documented, @Target и @Inherited? |
||
363 | |||
364 | h3. Что делают аннотации @Override, @Deprecated, @SafeVarargs и @SuppressWarnings? |
||
365 | |||
366 | h3. Какой жизненный цикл аннотации можно указать с помощью @Retention? |
||
367 | |||
368 | h3. К каким элементам можно применять аннотацию, как это указать? |
||
369 | |||
370 | h3. Как создать свою Аннотацию? |
||
371 | |||
372 | h3. Атрибуты каких типов допустимы в аннотациях? |
||
373 | |||
374 | h3. Что такое JMX? |
||
375 | |||
376 | h3. Какие выгоды предлагает JMX? |
||
377 | |||
378 | h3. Что еще умеет JMX кроме дистанционного управления? |
||
379 | |||
380 | h3. Что такое MBean? |
||
381 | |||
382 | h3. Какие типы MBeans существуют? |
||
383 | |||
384 | h3. Что такое MBean Server? |
||
385 | |||
386 | h3. Какие механизмы обеспечивают безопасность в технологии Java? |
||
387 | |||
388 | h3. Назовите несколько видов проверок которые выполняет верификатор байт-кода Java? |
||
389 | |||
390 | h3. Что вы знаете о "диспетчере защиты" в Java? |
||
391 | |||
392 | h3. Что такое JAAS? |
||
393 | |||
394 | h3. Что такое Рефакторинг? |