Java-інтерв'ю часто містять складні та провокаційні питання, які мають на меті перевірити глибоке розуміння концепцій. Ось деякі просунуті та цікаві питання з поясненнями та прикладами, які допоможуть вам освоїти Java.
1. Що станеться, якщо ви перекриєте приватний метод?
Питання:
Чи можна перекрити приватний метод у Java?
Пояснення:
Ні, приватні методи не можна перекрити, оскільки вони не видимі для підкласів. Однак, якщо ви визначите метод з таким самим іменем у підкласі, це буде приховування методу, а не перекриття.
Приклад:
class Parent {
private void display() {
System.out.println("Parent method");
}
}
class Child extends Parent {
private void display() {
System.out.println("Child method");
}
}
public class Test {
public static void main(String[] args) {
Parent obj = new Child();
// obj.display(); // Помилка компіляції
}
}
Вивід: Помилка компіляції, оскільки приватні методи недоступні.
2. Чи можна спіймати виняток, що виникає в статичному блоці?
Питання:
Що станеться, якщо в статичному блоці виникне виняток?
Пояснення:
Винятки, що виникають у статичному блоці, можна спіймати лише в статичному ініціалізаторі, використовуючи try-catch
. В іншому випадку програма не зможе завантажити клас.
Приклад:
class Test {
static {
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Exception caught: " + e);
}
}
public static void main(String[] args) {
System.out.println("Main method executed");
}
}
Вивід:
Exception caught: java.lang.ArithmeticException: / by zero
Main method executed
3. Що станеться, якщо викликати метод run() безпосередньо замість start()?
Питання:
Яка різниця між викликом run()
і start()
для потоку?
Пояснення:
- Виклик
start()
створює новий потік та виконує методrun()
в цьому потоці. - Виклик
run()
безпосередньо виконує код у поточному потоці, не створюючи нового потоку.
Приклад:
class MyThread extends Thread {
public void run() {
System.out.println("Thread running");
}
}
public class Test {
public static void main(String[] args) {
MyThread t1 = new MyThread();
t1.run(); // Виконується в головному потоці
t1.start(); // Виконується в новому потоці
}
}
Вивід:
Thread running
Thread running
4. Що станеться, якщо викликати метод wait() поза синхронізованим блоком?
Питання:
Який виняток виникне, якщо викликати wait()
поза синхронізованим блоком?
Пояснення:
Виклик wait()
поза синхронізованим блоком призведе до виникнення IllegalMonitorStateException, оскільки wait()
повинен викликатися при отриманому замку.
Приклад:
public class Test {
public static void main(String[] args) throws InterruptedException {
Object obj = new Object();
obj.wait(); // Виникає IllegalMonitorStateException
}
}
5. Чи може конструктор бути синхронізованим?
Питання:
Чи можна оголосити конструктор як synchronized
?
Пояснення:
Ні, конструктори не можуть бути синхронізованими, оскільки замки об'єктів не існують до створення об'єкта. Однак синхронізовані блоки можуть використовуватися всередині конструкторів.
Приклад:
class Test {
Test() {
synchronized (this) {
System.out.println("Synchronized block in constructor");
}
}
}
6. Що станеться, якщо повернути значення з блоку try або catch? Чи виконається finally?
Питання:
Якщо в блоці try
або catch
є оператор return
, чи виконається блок finally
?
Пояснення:
Так, блок finally
завжди виконується, навіть якщо в блоці try
або catch
є оператор return
.
Однак, якщо в блоці finally
також є оператор return
, він перекриває інші значення, що повертаються.
Приклад:
public class Test {
public static int testMethod() {
try {
return 1;
} catch (Exception e) {
return 2;
} finally {
return 3;
}
}
public static void main(String[] args) {
System.out.println(testMethod()); // Вивід: 3
}
}
7. Що станеться, якщо виняток виникне в блоці finally?
Питання:
Що станеться, якщо в блоці finally
виникне виняток?
Пояснення:
Винятки в блоці finally
пригнічують винятки з блоків try
або catch
.
Приклад:
public class Test {
public static void main(String[] args) {
try {
int result = 10 / 0;
} catch (Exception e) {
System.out.println("Catch executed");
} finally {
throw new RuntimeException("Exception in finally");
}
}
}
Вивід:
Exception in finally
Ці складні та цікаві питання для інтерв'ю з Java висвітлюють глибші аспекти мови. Розуміння цих моментів допоможе вам не лише на інтерв'ю, а й зробить вас кращим програмістом!
Перегляньте більше цікавих статей тут: https://medium.com/@poojaauma
Перекладено з: Tricky and Interesting Java Interview Questions (Part-1)