Питання для співбесіди про метод `main()` у Java з відповідями

pic

1. Чому метод main() є public static?

Метод main() у Java є статичним (static), щоб JVM могла безпосередньо викликати його без створення об'єкта класу.

Якщо метод main() буде нестатичним, JVM доведеться створювати екземпляр класу, і це створить неоднозначність, якщо конструктор класу має аргументи. У такому випадку виникає питання: який конструктор має викликати JVM і які параметри йому передати? Ми знаємо, що JVM не може створити екземпляр класу без виклику його конструктора.

Нижче наведено приклад, що демонструє, чому метод main() є статичним:

public class MainMethodDemo {  

 public MainMethodDemo(int arg0) {  
 // Конструктор з одним аргументом  
 }  

 public MainMethodDemo(int arg0, int arg1) {  
 // Конструктор з двома аргументами  
 }  

 public MainMethodDemo(String arg[]) {  

 }  

 public void main(String...args) {  
 // Нестатичний метод main  
 }  
}

Чому ж метод main() є public?

Ми знаємо, що будь-який метод з модифікатором доступу public може бути викликаний звідусіль. Метод main() є public у Java, тому що JVM повинен викликати його. Якщо main() не є public, JVM не зможе його викликати.

2. Чи можна перевантажити метод main() у Java?

Так, метод main() можна перевантажити. У Java клас може мати будь-яку кількість методів main(). Але для запуску Java класу він повинен мати метод main() з підписом public static void main(String[] args).

Нижче наведено діаграму, яка демонструє, що метод main() можна перевантажити:

pic

Ось простий приклад перевантаження main():

package net.javaguides.corejava;  

import java.util.Arrays;  

public class MainMethodDemo {  

 /** Основний метод main з String[] args **/  
 public static void main(String[] args) {  
 System.out.println("String[] args main метод викликано");  
 main(new Double[] {  
 1.0,  
 2.0,  
 3.0  
 });  
 }  

 /** Перевантажений метод main з Double[] args **/  
 public static void main(Double[] args) {  
 System.out.println("Double[] args main метод викликано");  
 System.out.println(Arrays.toString(args));  
 }  
}

Вихід:

String[] args main метод викликано  
Double[] args main метод викликано  
[1.0, 2.0, 3.0]

3. Чи можна оголосити main() як private, protected або без модифікатора доступу?

Ні, метод main() повинен бути public. Ви не можете визначити main() як private чи protected або без модифікатора доступу, оскільки JVM повинен мати доступ до цього методу.

Нижче наведено діаграму, яка демонструє помилку виконання, якщо main() визначено як не public:

pic

4. Чи можна оголосити main() як нестатичний?

Ні, метод main() має бути оголошений як static, щоб JVM міг викликати його без створення екземпляра класу. Якщо видалити ключове слово static з підпису main(), компіляція пройде успішно, але програма завершиться помилкою виконання.

Нижче наведено діаграму, яка демонструє, що main() має бути static, інакше JVM викличе помилку:

pic

5. Чи можна змінити тип повернення для main()?

Ні, тип повернення для main() повинен бути лише void. Жоден інший тип не приймається.

Нижче наведено діаграму, яка демонструє, що main() повинен мати тип повернення void:

pic

6. Чи може метод main() приймати аргумент, відмінний від масиву String?

Ні, аргументом методу main() повинен бути масив String. Однак, починаючи з введення var args, ви можете передавати var args типу String як аргумент до main().
Знову ж таки, var args — це лише масиви.

Нижче наведена діаграма демонструє, що метод main() повинен мати аргумент у вигляді масиву String або var args:

pic

Чи можемо ми визначити клас Java без методу main()?

Ні, починаючи з Java 7, ми не можемо визначити клас без методу main(). У попередніх версіях Java можна було використовувати Статичні Ініціалізатори (Static Initializers) як альтернативу:

public class MainMethodDemo  
{  
 static  
 {  
 System.out.println("Static Initalizer");  
 System.exit(0);  
 }  
}

Результат: (для JDK 7)

Error: Main method not found in class Test, please define the main method as:  
 public static void main(String[] args)  
or a JavaFX application class must extend javafx.application.Application

Результат: (для JDK 6)

Static Initalizer

Чи можемо ми оголосити main() як final у Java?

Так, ви можете зробити метод main() final.

Нижче наведена діаграма демонструє, що ми можемо мати метод main() як final у Java:

pic

Перекладено з: Java main() Method Interview Questions with Answers

Leave a Reply

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