Java 메인 메서드가 정적인 이유는 무엇입니까?
자바 main
을 사용하다
public static void main(String[] args) {
...
}
이 방법이 정적이어야 하는 이유가 있습니까?
이건 그냥 관례일 뿐이야실제로 main()이라는 이름과 전달된 인수조차 순전히 규칙입니다.
java.exe(또는 javaw)를 실행하는 경우.실제로는 Java Native Interface(JNI; Java Native Interface) 콜이 몇 개 발생하고 있습니다.이러한 호출은 실제로 JVM인 DLL을 로드합니다(오른쪽은 java.exe가 JVM이 아닙니다). JNI는 가상 머신 세계와 C, C++ 등의 세계를 브리지할 때 사용하는 도구입니다.JNI를 사용하지 않고 실제로 JVM을 실행하는 것은 (적어도 제가 아는 한) 불가능합니다.
기본적으로 java.exe는 명령줄을 해석하고 이러한 인수를 유지하기 위해 JVM에 새로운 String 배열을 만들고 main()을 포함하는 것으로 지정한 클래스 이름을 구문 분석하여 main() 메서드 자체를 검색한 후 새로 생성된 문자열 배열을 매개 변수로 전달하기 위한 main() 메서드를 호출하는 매우 단순한 C 응용 프로그램입니다.이것은 Java로부터의 리플렉션을 사용할 때의 동작과 매우 비슷합니다.대신 혼동하기 쉬운 네이티브 함수 호출을 사용할 뿐입니다.
java.exe의 독자적인 버전(소스는 JDK와 함께 배포됨)을 작성하여 완전히 다른 작업을 수행하는 것이 전적으로 합법적입니다.사실, 이것이 바로 우리가 모든 Java 기반 앱에서 하는 일입니다.
각 Java 앱에는 자체 런처가 있습니다.이것은 주로 독자적인 아이콘과 프로세스명을 취득하기 위해서 행해지고 있습니다만, 통상의 main() 콜 이외의 조작을 실시하는 경우에 편리합니다(예를 들면, COM 의 상호 운용성을 실현해, 실제로는 문자열 배열이 아닌 main() 에 COM 핸들을 건네줍니다).
길고 짧게 말하면, 정적인 이유는 편리한 b/c입니다.main이라고 불리는 이유는 무엇인가가 필요하기 때문이고, main()은 옛날 C(그 당시에는 함수의 이름이 중요했다)에서 했던 일입니다.java.exe를 사용하면 클래스(java com.mycompany)가 아니라 완전한 메인 메서드 이름만 지정할 수 있습니다.Foo.some Special Main) - 그러나 IDE에서는 프로젝트의 '시작 가능한' 클래스를 자동 검출하기가 더 어려워집니다.
메서드는 정적입니다.그렇지 않으면 애매모호하기 때문입니다.어느 컨스트럭터를 호출해야 합니까?특히 당신의 클래스가 다음과 같은 경우:
public class JavaClass{
protected JavaClass(int x){}
public void main(String[] args){
}
}
이 JVM을 호출해야 ?new JavaClass(int)
무엇으로 통해야 하는가?x
않은 경우 은 JVM을 ?JavaClass
스트 터메 메서 행? ?? ???그렇지 않다고 생각합니다.클래스 전체에 특화된 경우가 있기 때문입니다.초기화되지 않은 인스턴스가 있을 수 있기 때문에 호출할 수 있는 모든 메서드에서 확인해야 합니다.
진입점을 호출하기 전에 JVM이 클래스를 인스턴스화해야 하는 것은 이해하기 어려울 정도로 많은 에지 케이스와 모호성이 있습니다.★★★★★★★★★★★★★★★★★★.main
태틱입입니니다
그런지 .main
에는 항상 「」라고 가 붙어 있습니다.public
★★★★★★★★★★★★★★★★★★.
main
C++, C# Java 。
이는 오브젝트를 인스턴스화하지 않고 런타임엔진에 의해 호출될 수 있으며 그 후 코드 본문에 있는main
머진다다다다
public static void main(String [ ] args)의 이유
Java Language는 이렇게 설계되고 Java Virtual Machine은 설계 및 작성됩니다.
Oracle Java 언어 사양
12장 실행 - 섹션 12.1.4 Test.main 호출:
마지막으로 클래스 테스트의 초기화가 완료된 후(다른 결과 로드, 링크 및 초기화가 발생했을 수 있음), 테스트의 메서드메인이 호출됩니다.
메서드 main은 public, static 및 void로 선언해야 합니다.문자열 배열인 단일 인수를 받아들여야 합니다.이 메서드는 다음 중 하나로 선언할 수 있습니다.
public static void main(String[] args)
또는
public static void main(String... args)
Oracle Java 가상 시스템 사양
2장 Java 프로그래밍 언어 개념 - 섹션 2.17 실행:
Java 가상 시스템은 지정된 클래스의 메서드 메인을 호출하고 문자열 배열인 단일 인수를 전달하여 실행을 시작합니다.이것에 의해, 지정된 클래스가 로드( 「2.17.2」), 사용하는 다른 타입에 링크( 「2.17.3」), 및 초기화( 「2.17.4」)됩니다.메서드 main은 public, static 및 void로 선언해야 합니다.
Oracle OpenJDK 소스
JVM이 쓰여져 있는지 합니다.JVM을 해 주세요.../launcher/java.c
C 되어 있습니다.java [-options] class [args...]
:
/*
* Get the application's main class.
* ... ...
*/
if (jarfile != 0) {
mainClassName = GetMainClassName(env, jarfile);
... ...
mainClass = LoadClass(env, classname);
if(mainClass == NULL) { /* exception occured */
... ...
/* Get the application's main method */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
"([Ljava/lang/String;)V");
... ...
{ /* Make sure the main method is public */
jint mods;
jmethodID mid;
jobject obj = (*env)->ToReflectedMethod(env, mainClass,
mainID, JNI_TRUE);
... ...
/* Build argument array */
mainArgs = NewPlatformStringArray(env, argv, argc);
if (mainArgs == NULL) {
ReportExceptionDescription(env);
goto leave;
}
/* Invoke main method. */
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);
... ...
하자.static
응용 프로그램 진입점으로 필요하지 않습니다.
그러면 응용 프로그램클래스는 다음과 같습니다.
class MyApplication {
public MyApplication(){
// Some init code here
}
public void main(String[] args){
// real application code here
}
}
와 컨스트럭터 코드의 main
OO Speak에서 생성자는 인스턴스가 올바르게 초기화되었는지만 확인해야 하기 때문에 메서드가 필요합니다.초기화 후 인스턴스를 의도된 "서비스"에 사용할 수 있습니다.완전한 어플리케이션 코드를 컨스트럭터에 넣는 것은 그것을 망칠 수 있습니다.
따라서 이 접근방식은 애플리케이션에 대해 세 가지 다른 계약을 강제한다.
- 기본 생성자가 있어야 합니다.그렇지 않으면 JVM은 어떤 컨스트럭터를 호출하고 어떤 파라미터를 제공해야 하는지 알 수 없게 됩니다.
- 이 있어야 합니다.
main
메서드를1 사용합니다.그래, 놀랄 일도 아니지 - 클래스는 다음과 같을 수 없습니다.
abstract
그렇지 않으면 JVM이 인스턴스화할 수 없었습니다.
static
한편, 접근방식은 1개의 계약만 필요로 합니다.
- '이렇게 하다'가 예요.
main
메서드를1 사용합니다.
도 아니다abstract
여러 개의 컨스트럭터도 문제가 되지 않습니다.
Java는 사용자에게 단순한 언어가 되도록 설계되었기 때문에 애플리케이션 엔트리 포인트도 하나의 계약을 사용하여 단순한 방식으로 설계되었으며 3개의 독립적이고 취약한 계약을 사용하여 복잡한 방식으로 설계되지 않은 것은 놀라운 일이 아닙니다.
주의:이 주장은 JVM 내부 또는 JRE 내부의 단순성에 관한 것이 아닙니다.이 주장은 사용자의 단순성에 관한 것입니다.
1Here the complete signature counts as only one contract.
그렇지 않다면 둘 이상의 컨스트럭터가 있는 경우 어떤 컨스트럭터를 사용해야 합니까?
Java Language Specification(Java 언어 사양)에 Java 프로그램의 초기화 및 실행에 대한 자세한 내용은 Java Language Specification을 참조하십시오.
메인 메서드를 호출하기 전에 오브젝트는 인스턴스화되지 않습니다.static 키워드를 지정하면 오브젝트를 먼저 작성하지 않고 메서드를 호출할 수 있습니다.
그렇지 않으면 실행할 객체의 인스턴스가 필요하기 때문입니다.그러나 일반적으로 이러한 인수/프로그램 파라미터를 사용하여 인수를 해석하고 개체를 구성하는 것은 main() 함수(부트스트랩)의 태스크이기 때문에 개체를 먼저 구성하지 않고 처음부터 호출해야 합니다.
이런 것들을 좀 더 쉽게 설명하겠습니다.
public static void main(String args[])
한 모든 은 Java에서 합니다.main()
.
" " "public
는 클래스 외부에서 멤버를 호출할 수 있는 액세스 수식자입니다.
static
할 수 있는 것은, 「」를 사용할 수 있기 입니다.main()
해당 클래스의 특정 인스턴스를 인스턴스화할 필요 없이 호출됩니다.
void
것을 .main()
값은 반환되지 않습니다.
의 의미는 무엇입니까?public static void main(String args[])
public
JVM(Java Virtual Machine)은 JVM/Java Virtual Machine입니다.static
main()
클래스 오브젝트가 생성되기 전에 호출됩니다.은 필요 입니다.main()
오브젝트가 작성되기 전에 JVM에 의해 호출됩니다.정적이므로 클래스를 통해 직접 호출할 수 있습니다.class demo { private int length; private static int breadth; void output(){ length=5; System.out.println(length); } static void staticOutput(){ breadth=10; System.out.println(breadth); } public static void main(String args[]){ demo d1=new demo(); d1.output(); // Note here output() function is not static so here // we need to create object staticOutput(); // Note here staticOutput() function is static so here // we needn't to create object Similar is the case with main /* Although: demo.staticOutput(); Works fine d1.staticOutput(); Works fine */ } }
마찬가지로 사용자 정의 메서드에 static을 사용하므로 객체를 만들 필요가 없습니다.
void
에 의해,main()
선언된 메서드는 값을 반환하지 않습니다.String[] args
의 유일한 파라미터를 지정합니다.main()
방법.args
- 클래스 유형의 객체 배열을 포함하는 매개 변수String
.
이건 그냥 관례일 뿐인데, 아마 대안보다 더 편리할 거예요.스태틱 메인의 경우 Java 프로그램을 호출하기 위해 알아야 할 것은 클래스의 이름과 위치뿐입니다.정적이 아닌 경우 해당 클래스를 인스턴스화하는 방법을 알고 있거나 클래스에 빈 생성자가 있어야 합니다.
다양한 종류의 애플릿, 미드렛, 서블릿, 콩이 만들어지고 그 위에 라이프 사이클 방법이 있다.메인 클래스에는 메인 호출만 수행되므로 여러 번 호출되는 개체로 상태를 유지할 필요가 없습니다.메인 오브젝트를 작성하기 위해 클래스를 사용하는 데 방해가 되는 다른 클래스(좋은 아이디어는 아니지만)에 메인 오브젝트를 고정하는 것은 매우 정상적인 일입니다.
메인 메서드가 스태틱하지 않은 경우 프로그램 외부에서 메인 클래스의 개체를 만들어야 합니다.어떻게 하고 싶으세요?
를 사용하여 Java Virtual Machine(JVM; Java 가상 머신)을 실행하는 경우java
명령어,
java ClassName argument1 argument2 ...
응용 프로그램을 실행할 때 위와 같이 java 명령어에 대한 인수로 클래스 이름을 지정합니다.
JVM은 사용자가 지정한 클래스의 주요 메서드를 호출하려고 합니다.
:이 시점에서는 클래스의 오브젝트는 생성되지 않았습니다.
선언하다
main
정적으로allows
JVM에 접속합니다.invoke
주된without
작성,instance
클래스입니다.
명령어로 돌아가겠습니다
ClassName
는 입니다.command-line argument
실행할 클래스를 지시하는 JVM으로 이동합니다.ClassName 뒤에 다음 명령어를 지정할 수도 있습니다.list of Strings
(스페이스로 구분됨) 명령행 인수로 JVM이 응용 프로그램에 전달할 수 있습니다.-이러한 인수는 응용 프로그램을 실행하기 위한 옵션(파일 이름 등)을 지정하기 위해 사용될 수 있습니다.-이러한 인수는 다음과 같은 파라미터가 존재하는 이유입니다.String[] args
대체로
참고 자료:Java™ How To Program(얼리 오브젝트), 제10판
그것은 단지 관례일 뿐이다.그것이 관례였다면 JVM은 분명히 비정적 메인 메서드를 처리할 수 있었습니다.즉, 클래스에 스태틱인테셜라이저를 정의하고 main() 메서드에 도달하기 전에 수십억 개의 객체를 인스턴스화할 수 있습니다.
키워드 'static'은 메인 메서드를 클래스 메서드로 만들고 클래스 메서드는 그 복사본이 1개뿐이고 모두가 공유할 수 있으며 참조할 오브젝트가 필요하지 않다고 생각합니다.따라서 드라이버 클래스가 컴파일되면 메인 메서드를 호출할 수 있습니다.(자바의 알파벳 수준일 뿐이므로 틀렸다면 죄송합니다.)
main()은 정적인 이유는 어플리케이션의 라이프 사이클에서 아직 인스턴스화된 객체가 없기 때문에 어플리케이션스택은 절차적으로 동작하기 때문입니다.
백지상태입니다.이 시점에서는 오브젝트가 선언되지 않은 상태에서도 어플리케이션이 실행되고 있습니다(프로시저 및 OO 코딩 패턴이 있습니다).개발자는 오브젝트의 인스턴스를 만들고 그 안에 컴파일된 코드에 따라 어플리케이션을 오브젝트 지향 솔루션으로 만들 수 있습니다.
객체 지향은 수백만 가지 분명한 이유로 위대하다.그러나 대부분의 VB 개발자들이 코드에 "goto"와 같은 키워드를 정기적으로 사용하던 시대는 지났다."goto"는 VB의 절차 명령으로, OO의 대응 명령인 메서드 호출로 대체됩니다.
정적 진입점(메인)을 순수한 자유로 볼 수도 있습니다.Java가 개체를 인스턴스화하고 실행 중에 해당 인스턴스만 제공할 수 있을 정도로 충분히 다르다면 절차 앱을 작성할 수밖에 없습니다.Java에서는 상상할 수 없는 것처럼 들릴 수 있지만 절차적 접근을 필요로 하는 많은 시나리오가 있을 수 있습니다.
이것은 아마 매우 애매한 대답일 것이다."class"는 상호 관련 코드 모음일 뿐입니다."인스턴스"는 그 계급의 고립된, 살아 숨쉬는 자율 세대이다.
최근 프로그래머들에게 비슷한 질문이 올라왔다.SE
- 왜 컨스트럭터가 아닌 Java 및 C#에서 스태틱메인 메서드를 사용하는가?
프라이머리 소스 또는 세컨더리 소스로부터의 최종적인 답변을 찾고 있는 경우, (특히) Java 및 C#은 애플리케이션 인스턴스를 엔트리로 나타내지 않고,
Application
적절한 컨스트럭터(institute point)를 사용하여 클래스(class?
TL;DR은 승인된 답변의 일부입니다.
자바에서는,
public static void main(String[] args)
그것이다
C#의 경우, 추론은 말하자면 과도적으로 유사합니다.언어 설계자는 Java에서 온 프로그래머에게 프로그램 진입점 구문을 친숙하게 유지했습니다.C# 건축가인 Anders Hejlsberg가 말했듯이C#에 대한 우리의 접근법은 단순히 다른 방법을 제공하는 것이었다.자바 프로그래머에게...
...
모든 애플리케이션에 대한 진정한 진입점은 정적 방식입니다.Java 언어가 인스턴스 메서드를 "엔트리 포인트"로 지원한다면 런타임은 오브젝트의 인스턴스를 구성하고 그 후에 인스턴스 메서드를 호출하는 정적 메서드로 내부적으로 구현해야 합니다.
그 후 다음 세 가지 옵션 중 하나를 선택해야 하는 이유를 검토합니다.
- A
static void main()
지금 보시는 바와 같이요. - 인스턴스 방식
void main()
새로 생성된 객체에 호출됩니다. - 유형의 생성자를 진입점으로 사용(예: 엔트리 클래스가 호출된 경우)
Program
실행은 실질적으로 다음과 같이 구성됩니다.new Program()
).
내역:
static void main()
- 엔클로징 클래스의 스태틱컨스트럭터를 호출합니다.
- 스태틱 메서드를 호출합니다.
main()
.
void main()
- 엔클로징 클래스의 스태틱컨스트럭터를 호출합니다.
- 효과적으로 호출하여 엔클로저 클래스의 인스턴스를 구성합니다.
new ClassName()
. - 인스턴스 메서드를 호출합니다.
main()
.
new ClassName()
- 엔클로징 클래스의 스태틱컨스트럭터를 호출합니다.
- 클래스의 인스턴스를 만듭니다(그 후 아무 작업도 하지 않고 단순히 반환합니다.
근거:
이번에는 거꾸로 하겠습니다.
Java의 설계 목표 중 하나는 우수한 객체 지향 프로그래밍 관행을 강조하는 것입니다(가능한 경우 필요).이 컨텍스트에서 개체의 생성자는 개체를 초기화하지만 개체의 동작을 책임지지 않아야 합니다.따라서 진입점을 제공한 규격은 다음과 같습니다.new ClassName()
모든 어플리케이션에서 "이상적인" 컨스트럭터 설계에 예외를 적용함으로써 새로운 Java 개발자의 상황을 혼란스럽게 할 수 있습니다.
만드는 것으로main()
인스턴스 방식, 위의 문제는 확실히 해결되었습니다.단, 규격에 엔트리 클래스 생성자의 시그니처와 함께 엔트리 클래스 생성자의 시그니처를 나열하도록 요구함으로써 복잡성이 발생합니다.main()
방법.
즉, a를 지정하면 동작을 메서드에 배치하는 원칙을 준수하면서 복잡도가 가장 낮은 사양이 생성됩니다.구현이 얼마나 간단한지를 고려하면서main()
클래스 인스턴스를 작성하고 인스턴스 메서드를 호출하는 메서드는 지정하는데 실질적인 이점이 없습니다.main()
인스턴스 메서드로 사용합니다.
프로토이프public static void main(String[])
는 JLS에 정의되어 있는 표기법입니다.
메서드 main은 public, static 및 void로 선언해야 합니다.선언된 유형이 String 배열인 형식 매개 변수('8.4.1)를 지정해야 합니다.
JVM 사양 5.2. 읽을 수 있는 가상 시스템 시작:
Java 가상 머신은 부트스트랩 클래스 로더( (5.3.1)를 사용하여 구현에 따라 지정된 초기 클래스를 생성하여 시작합니다.그런 다음 Java 가상 머신은 초기 클래스를 링크하고 초기화하고 퍼블릭클래스 메서드 void main(String[])을 호출합니다.이 메서드의 호출에 의해 모든 실행이 촉진됩니다.메인 메서드를 구성하는 Java 가상 머신의 명령을 실행하면 추가 클래스 및 인터페이스의 링크(결과적으로 생성)와 추가 메서드의 호출이 발생할 수 있습니다.
재미있는 것은 JVM 사양에서는 메인 메서드가 정적일 필요가 없다는 것입니다.그러나 사양에는 Java 가상 머신이 다음 두 단계를 수행한다고 나와 있습니다.
클래스 또는 인터페이스의 초기화는 클래스 또는 인터페이스 초기화 메서드의 실행으로 구성됩니다.
2.9에서 특수 방법:
클래스 또는 인터페이스의 초기화 방식이 정의됩니다.
클래스 또는 인터페이스는 최대 1개의 클래스 또는 인터페이스 초기화 방식을 가지며, 이 방식을 호출함으로써 초기화됩니다('5.5).클래스 또는 인터페이스의 초기화 메서드에는 특별한 이름이 있습니다.
<clinit>
는 인수를 사용하지 않으며 무효입니다.
또한 클래스 또는 인터페이스의 초기화 방식은 다음과 같이 정의된 인스턴스 초기화 방식과 다릅니다.
Java 가상 머신의 레벨에서는 Java 프로그래밍 언어(JLS 8 8.8)로 작성된 모든 컨스트럭터가 특별한 이름을 가진 인스턴스 초기화 방법으로 나타납니다.
<init>
.
따라서 JVM은 클래스 또는 인터페이스 초기화 메서드를 초기화하며 실제 생성자인 인스턴스 초기화 메서드는 초기화하지 않습니다.메인 메서드를 호출하기 전에는 인스턴스가 생성되지 않으므로 JVM 사양에서 메인 메서드가 정적일 필요는 없습니다.
그public
키워드는 액세스 수식자입니다.이것에 의해, 프로그래머는 클래스 멤버의 가시성을 제어할 수 있습니다.클래스 멤버 앞에 다음 명령어가 있는 경우public
그 멤버는 선언된 클래스 이외의 코드로 액세스 할 수 있습니다.
의 반대입니다.public
이private
이는 멤버가 클래스 외부에서 정의된 코드에 의해 사용되는 것을 방지합니다.
이 경우,main()
라고 선언해야 한다.public
프로그램을 시작할 때 클래스 밖에서 코드로 호출해야 하기 때문입니다.
키워드static
허용한다main()
클래스의 특정 인스턴스를 인스턴스화할 필요 없이 호출됩니다.이것은 다음부터 필요합니다.main()
는 오브젝트가 작성되기 전에 Java 인터프리터에 의해 호출됩니다.
키워드void
컴파일러에게 간단히 말한다.main()
는 값을 반환하지 않습니다.
public static void 키워드는 Java Virtual Machine(JVM; Java 가상 머신) 인터프리터가 클래스의 인스턴스를 만들지 않고 프로그램의 주요 메서드를 호출하여(public) 프로그램을 시작할 수 있음을 의미하며, 프로그램이 종료될 때 데이터를 Java VM 인터프리터(void)에 반환하지 않습니다.
출처: Essentials, Part 1, 레슨 2: 어플리케이션 구축
static - JVM이 메인 메서드를 호출할 때 호출되는 클래스에 대해 존재하는 객체가 없으므로 클래스에서 호출할 수 있도록 정적 메서드를 사용해야 합니다.
개체가 인스턴스화되기 전에 JVM이 메인 메서드를 호출하는지...그러나 main() 메서드가 스태틱한 이유는 훨씬 더 강력합니다.JVM이 클래스의 메인 메서드를 호출하는 경우(Person 등)."Person.main()"에 의해 호출됩니다.JVM은 클래스 이름으로 호출합니다.그렇기 때문에 main() 메서드는 JVM에 의해 액세스 할 수 있도록 스태틱하고 public이어야 합니다.
도움이 됐으면 좋겠다.만약 그렇다면 댓글로 알려주세요.
정적 메서드에는 개체가 필요하지 않습니다.직행이기 때문에 메인 직행입니다.
메인 메서드에서 실행되는 인스턴스화가 없기 때문에 메인 메서드의 정적 키워드가 사용됩니다.그러나 호출이 아닌 객체가 생성되므로 메인 메서드에서 정적 키워드를 사용합니다.jvm 컨텍스트메모리는 클래스가 로드될 때 생성됩니다.모든 스태틱멤버는 그 메모리에 존재합니다.메인 스태틱을 설정하면 메모리에 저장되어 jvm(class.main(..))에 액세스 할 수 있기 때문에 히프가 생성되지 않아도 메인메서드를 호출할 수 있습니다.
이것은 여기서 볼 수 있듯이 단순한 관례입니다.
메서드는 public 및 static으로 선언되어야 하며 값을 반환해서는 안 되며 String 배열을 매개 변수로 받아들여야 합니다.기본적으로 첫 번째 non-option 인수는 호출되는 클래스의 이름입니다.정규화된 클래스 이름을 사용해야 합니다.-jar 옵션을 지정한 경우 첫 번째 non-option 인수는 Main-Class 매니페스트 헤더가 나타내는 시작 클래스와 응용 프로그램의 클래스 및 리소스 파일을 포함하는 JAR 아카이브 이름입니다.
http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/java.html#description
기본적으로 오브젝트와 관련된 어떠한 작업도 수행하지 않는 DATA MEMBRESS와 MEMBER FUNTIONS는 정적으로 기능합니다.또한 메인 메서드의 경우 오브젝트 작성 여부에 관계없이 항상 메인 메서드가 실행되므로 오브젝트와는 무관하기 때문에 STATIC으로 만듭니다.
Java에서 static으로 선언된 모든 메서드는 클래스 자체에 속합니다. 다시 말하지만 특정 클래스의 static 메서드는 다음과 같은 클래스를 참조해야만 액세스할 수 있습니다.Class_name.method_name();
따라서 정적 메서드에 액세스하기 전에 클래스를 인스턴스화할 필요가 없습니다.
따라서 main() 메서드는 다음과 같이 선언됩니다.static
해당 클래스의 개체를 만들지 않고 액세스할 수 있습니다.
메인 메서드가 존재하는 클래스의 이름으로 프로그램을 저장하기 때문에(또는 프로그램이 실행을 시작해야 하는 곳에서), 프로그램이 없는 클래스에 적용됩니다.main()
method()(상세 레벨)입니다.위에서 설명한 방법으로:
Class_name.method_name();
메인 메서드에 액세스 할 수 있습니다.
요약하면 프로그램이 컴파일되면main()
가진 방법String
다음과 같은 인수:main(String args[])
main() 메서드는 처음에 해당 클래스를 인스턴스화할 수 없기 때문에 static으로 선언됩니다.
java.sun.com 에서 (자세한 내용은 사이트를 참조해 주세요) :
제어 클래스의 인스턴스를 먼저 만들지 않고 Java VM 인터프리터에 클래스를 시작할 수 있는 방법을 제공하기 위한 주요 방법은 static입니다.제어 클래스의 인스턴스는 프로그램 시작 후 메인 메서드로 생성됩니다.
메인 메서드는 다른 정적 메서드와 마찬가지로 관련 클래스의 인스턴스를 만들지 않고도 호출할 수 있기 때문에 프로그램의 다른 어떤 것보다 먼저 실행할 수 있습니다.정적이지 않은 경우 객체를 호출하기 전에 객체를 인스턴스화해야 합니다. 이는 일반적으로 프로그램 시작 시 객체를 인스턴스화하기 위해 사용하는 방법이므로 '치킨 앤 에그' 문제가 발생합니다.
언급URL : https://stackoverflow.com/questions/146576/why-is-the-java-main-method-static
'programing' 카테고리의 다른 글
명령줄을 통해 GNU make 변수에 추가 (0) | 2022.09.03 |
---|---|
Vue 구성 요소 이벤트에서 Apollo 쿼리를 트리거하는 방법은 무엇입니까? (0) | 2022.09.03 |
.jar를 실행하려고 하면 "Invalid signature file"이 표시됩니다. (0) | 2022.09.03 |
Vuejs 웹 팩 압축 플러그인이 압축되지 않음 (0) | 2022.09.03 |
.a.o 파일과 .lo 파일의 차이점 (0) | 2022.09.03 |