- Питання, які перетинаються з цією серією статей , я пропускатиму, щоб зайвий раз не дублювати інформацію. Рекомендую прочитати ці матеріали, тому що там представлені найчастіші (популярні) питання для співбесід Java Core.
- Питання на DOU представлені українською, але у мене тут буде все російською.
- Відповіді можна було й розписати докладніше, але я не буду, тому що тоді відповідь на кожне запитання може затягнути цілу статтю. Та й так докладно вас на жодному соцзабезі не запитають.
11. Назвіть усі методи класу Object
Клас Object має 11 методів:- Class<?> getClass() - Отримання класу поточного об'єкта;
- int hashCode() — отримання хеш-коду поточного об'єкта;
- boolean equals (Object obj) - Порівняння поточного об'єкта з іншим;
- Object clone() — створення та повернення копії поточного об'єкта;
- String toString() - Отримання рядкового подання об'єкта;
- void notify() - пробудження одного потоку, що очікує на моніторі даного об'єкта (вибір рандомного потоку);
- void notifyAll() — пробудження всіх потоків, що очікує моніторі даного об'єкта;
- void wait() - перемикає поточний потік в режим очікування (заморожує його) на поточний монітор, працює тільки в synchronized блоці, поки який-небудь notify або notifyAll не розбудить потік;
- void wait(long timeout) - також заморожує поточний потік на поточний монітор (на поточний synchronized), але вже з таймером виходу з цього стану (ну або знову ж таки: поки notify або notifyAll не розбудить);
- void wait (long timeout, int nanos) - метод, аналогічний вищеописаному, але з більш точним таймерів виходу із заморозки;
- void finalize() - перед видаленням цього об'єкта збирачем сміття викликається цей метод (наостанок). Він використовується для очищення ресурсів, що займаються.
12. У чому різниця між try-with-resources і try-catch-finally під час роботи з ресурсами?
Як правило, при використанні try-catch-finally блок final застосовували для закриття ресурсів. У Java 7 з'явився новий вид оператора try-with-resources , аналог try-catch-finally для звільнення ресурсів, але більш компактний і легкочитаний. Давайте пригадаємо, як виглядає try-catch-finally :String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
А тепер давайте перепишемо цей код, але з використанням try-with-resources :
String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
}
Якось простіше стало, не знаходите? Крім спрощення, ще є кілька моментів:
-
У try-with-resources ресурси, оголошені в дужках (які будуть закриті) повинні імплементувати AutoCloseable інтерфейс і його єдиний метод — close() .
Метод close виконується у неявному finally блоці , інакше як програма зрозуміє, як саме цей закривати ресурс?
Але, швидше за все, ви рідко писатимете свої імплементації ресурсів та їх метод закриття.
-
Послідовність виконання блоків:
- Блок try .
- Неявний finally .
- Блок catch , який ловить винятки у попередніх кроках.
- Явний finally .
Як правило, винятки, які випали нижче за списком, перебивають ті, що випали вище.
13. Що таке побітові операції?
Побітові операції - це операції над ланцюжками бітів, які включають логічні операції і побітові зрушення. Логічні операції:-
побітове І - порівнює бітові значення, і по ходу цього будь-який біт, встановлений в 0 (false), встановлює відповідний біт в результаті як 0. Тобто якщо в обох порівнюваних значеннях біт був 1 (true), в результуючому теж буде 1.
Позначається як - AND , &
Приклад: 10111101 & 01100111 = 00100101
-
побітове АБО - операція, зворотна попередньої. Будь-який біт, встановлений в 1, встановлює аналогічний біт в результаті як 1. І, відповідно, якщо в обох порівнюваних значеннях біт був 0, в результуючому теж буде 0.
Позначається як - OR , |
Приклад: 10100101 | 01100011 = 11100111
-
побітове НЕ - застосовується до одного значення, перевертає (інвертує) біти. Тобто, ті біти, що були 1, стануть 0; а ті, що були 0, стануть 1.
Позначається як - NOT , ~
Приклад: ~10100101 = 01011010
побітове виключне АБО — порівнює бітові значення, і якщо в обох значеннях біт дорівнює 1, то результат буде 0, також якщо в обох значеннях біт 0, результат буде 0. Тобто, щоб результат дорівнював 1, потрібно, щоб тільки один з бітів дорівнював 1, а другий дорівнює 0. Позначається як XOR , ^
Приклад: 10100101 ^01100011 = 11000110
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000
14. Об'єкти яких стандартних класів є immutable в Java?
Immutable — це об'єкт, який дозволяє змінювати свої початкові параметри. Можливо, він має методи, які повертають нові об'єкти даного типу з параметрами, які ви хотіли змінити. Деякі стандартні immutable об'єкти:- безумовно, найвідоміший immutable об'єкт у Java - це String;
- екземпляри класів-оберток, які обертають стандартні типи: Boolean, Character, Byte, Short, Integer, Long, Double, Float;
- об'єкти, які зазвичай використовуються для особливо ВЕЛИКИХ чисел - BigInteger і BigDecimal;
- об'єкт, який є одиницею у стектрейсах (наприклад, у стектрейсі винятків) StackTraceElement;
- об'єкт класу File може змінювати файли, але при цьому сам по собі він незмінний;
- UUID – який часто використовується як унікальний id елементів;
- усі об'єкти класів пакету java.time;
- Locale — використовується визначення географічного, політичного чи культурного регіону.
15. Які переваги є immutable object перед звичайними об'єктами?
- Такі об'єкти — безпечні при використанні багатопоточного середовища . Використовуючи їх, ви можете не турбуватися про те, що буде втрачено дані через стан гонки потоків. На відміну від роботи зі звичайними об'єктами: у такому разі вам доведеться дуже добре продумати та опрацювати механізми використання об'єкта в паралельному середовищі.
- Immutable об'єкти є хорошими ключами в map, адже якщо використовувати об'єкт, що змінюється, а потім об'єкт змінить свій стан, при використанні HashMap може виникнути плутанина: об'єкт все ще буде присутній, і якщо використовувати containsKey() , то його можна і не знайти .
- Immutable об'єкти відмінно підходять для зберігання незмінних (константних) даних, які в жодному разі не повинні бути змінені під час роботи програми.
- "Атомарність по відношенню до збою" - якщо immutable об'єкт викине виняток, то він все одно не залишиться в небажаному (зламаному) стані.
- Ці класи прості в тестуванні.
- Не потрібні такі додаткові механізми, як конструктор копіювання та реалізація клону.
Питання щодо ОВП
16. У чому переваги ОВП у цілому та порівняно з процедурним програмуванням?
Отже, переваги ООП:- Складні програми писати простіше, ніж процедурним програмуванням, так як у нас все розбито на маленькі модулі - об'єкти, які взаємодіють між собою - і в результаті програмування зводиться до взаємовідносин між об'єктами.
- Програми, написані за допомогою ООП, набагато простіші у модифікації (при дотриманні концепцій проектування).
- Оскільки дані та операції з них утворюють єдину сутність, де вони розмазуються у всьому додатку (що нерідко буває при процедурному програмуванні).
- Інкапсуляція інформації захищає найкритичніші дані для роботи від користувача.
- Можливе перевикористання одного і того ж коду, з різними даними, адже класи дозволяють створювати безліч об'єктів, кожен з яких має власні значення атрибутів.
- Спадкування та поліморфізм також дозволяють перевикористовувати та розширювати вже існуючий код (замість дублювання схожого функціоналу).
- Простіша розширюваність програми, ніж при процедурному підході.
- Підхід ООП дає змогу абстрагуватися від деталей реалізації.
17. Розкажіть, які недоліки є у ОВП
На жаль, і вони присутні:- ООП вимагає великий обсяг теоретичних знань, який потрібно освоїти, перш ніж ви зможете щось написати.
- Ідеї ООП негаразд прості розуміння і застосування практично (треба бути у душі трохи філософом).
- При застосуванні ОВП трохи знижується продуктивність функціонування ПЗ через складнішу організацію системи.
- Для ОВП підходу потрібно більше пам'яті, оскільки все складається з класів, інтерфейсів, методів, які займають набагато більше пам'яті, ніж звичайні змінні.
- Тимчасові витрати на початковий аналіз більші, ніж при процедурному.
18. Що таке статичний та динамічний поліморфізм
Поліморфізм дає можливість об'єктам поводитися по-різному одного й того класу чи інтерфейсу. Існує два види поліморфізму, які ще відомі як раніше та пізніше зв'язування . Статичний поліморфізм, або раніше зв'язування:- відбувається під час компіляції (на ранній стадії життєвого циклу програми);
- вирішує, який спосіб виконувати під час компіляції;
- навантаження методу - це приклад статичного поліморфізму;
- до раннього зв'язування належать приватні, статичні та термінальні методи;
- успадкування не бере участь у ранньому зв'язуванні;
- у статичному поліморфізм беруть участь не конкретні об'єкти, а інформація про клас, тип якого представлений зліва від імені змінної.
- відбувається під час виконання (під час роботи програми);
- динамічний поліморфізм вирішує, яка саме реалізація буде у методу під час виконання;
- перевизначення методу - приклад динамічного поліморфізму;
- пізнє зв'язування - це призначення конкретного об'єкта, посилання його типу або суперкласу;
- успадкування пов'язане з динамічним поліморфізмом.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ