Хитромудрі та цікаві питання для інтерв’ю з Java (Частина 1)

Java-інтерв'ю часто містять складні та провокаційні питання, які мають на меті перевірити глибоке розуміння концепцій. Ось деякі просунуті та цікаві питання з поясненнями та прикладами, які допоможуть вам освоїти Java.

pic

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)

Leave a Reply

Your email address will not be published. Required fields are marked *