Почему я должен добавить статический метод в main, а не иначе?
Почему так работает:
public class Main {
public static void main(String[] args) {
Frame_Panel();
}
private static void Frame_Panel() {
}
}
а так нет?
public class Main {
public static void main(String[] args) {
Frame_Panel();
}
private void Frame_Panel() {
}
}
Ответы (2 шт):
Ты должен использовать static в main или в методе Frame_Panel(), потому что main вызывается без создания объекта. Если не хочешь делать Frame_Panel() статическим — нужно сначала создать объект класса Main.
Метод main является статическим в классе Main, а значит, из этого метода можно вызывать только другие статические методы класса Main, о чём, собственно, и говорится в ошибке компилятора для второго примера кода:
Main.java:4: error: non-static method Frame_Panel() cannot be referenced from a static context
Frame_Panel();
^
т.е. вызов нестатических методов из статического контекста запрещён.
Нестатические методы можно вызывать только у экземпляра некоего класса, в данном случае класса Main, который можно создать при помощи конструктора по умолчанию.
Однако исходный код следует исправить, используя стандартное соглашение о наименовании Naming Convention, для чего придётся переименовать метод в buildFramePanel(), так как по стандартному соглашению имена всех методов (статических и нестатических) начинаются с малой буквы (нижний верблюжий регистр, lowerCamelCase), а классов, интерфейсов и конструкторов -- с большой буквы (верхний верблюжий регистр, UpperCamelCase)
public class Main {
public static void main(String[] args) {
new Main().buildFramePanel();
}
private void buildFramePanel() {
}
}
Также стоит заметить, что название метода Frame_Panel() в исходном вопросе больше похоже на вызов конструктора соответствующего класса, соответственно, исходный код можно было бы переписать следующим образом:
public class Main {
public static void main(String[] args) {
new FramePanel();
}
}
class FramePanel {
// есть конструктор по умолчанию
}