문제

Java의 메소드 서명 기본() 방법은 다음과 같습니다.

public static void main(String[] args){
    ...
}

이 방법이 정적 인 이유가 있습니까?

도움이 되었습니까?

해결책

방법은 정적이며 그렇지 않으면 모호성이 있기 때문에 : 어떤 생성자를 호출해야합니까? 특히 수업이 다음과 같이 보이는 경우 :

public class JavaClass{
  protected JavaClass(int x){}
  public void main(String[] args){
  }
}

JVM이 호출해야합니다 new JavaClass(int)? 무엇을 통과해야합니까? x?

그렇지 않은 경우 JVM이 인스턴스화해야합니다 JavaClass 생성자 방법을 실행하지 않고? 나는 그것이 당신의 전체 클래스를 특별하게 생각하기 때문에 그렇게해서는 안된다고 생각합니다. 때로는 초기화되지 않은 인스턴스가 있으며, 호출 할 수있는 모든 방법에서 확인해야합니다.

JVM이 진입 지점을 호출하기 전에 클래스를 인스턴스화 해야하는 것이 너무 많은 엣지 케이스와 모호성이 너무 많습니다. 그것이 이유입니다 main 정적입니다.

나는 이유를 모른다 main 항상 표시됩니다 public 그렇지만.

다른 팁

이것은 단지 컨벤션입니다. 실제로, Main ()이라도 이름조차도 전달 된 주장은 순전히 협약입니다.

java.exe (또는 Windows에서 javaw.exe)를 실행하면 실제로 일어나고있는 것은 JNI (Java Native Interface) 호출입니다. 이 호출은 실제로 JVM 인 DLL을로드합니다 (맞습니다 -Java.exe는 JVM이 아닙니다). JNI는 가상 기계 세계와 C, C ++ 등을 연결해야 할 때 사용하는 도구입니다. 그 반대도 사실입니다. JNI를 사용하지 않고 실행하는 JVM.

기본적으로 java.exe는 명령 줄을 구문 분석하고 JVM에 새로운 문자열 배열을 생성하여 해당 인수를 보유하고 Main ()을 포함하여 지정된 클래스 이름을 구문 분석하고 JNI 호출을 사용하여 main () 메소드 자체는 새로 생성 된 문자열 배열을 매개 변수로 전달하여 main () 메소드를 호출합니다. 이것은 Java의 반사를 사용할 때하는 것과 매우 흡사합니다. 대신 혼란스럽게 명명 된 기본 기능 호출을 사용합니다.

자신의 버전의 java.exe (소스는 JDK와 함께 배포 됨)를 작성하고 완전히 다른 일을하는 것이 완벽하게 합법적입니다. 사실, 그것은 우리가 모든 Java 기반 앱에서 우리가하는 일입니다.

각 Java 앱에는 자체 런처가 있습니다. 우리는 주로이 작업을 수행하므로 우리 자신의 아이콘과 프로세스 이름을 얻지 만 정기적 인 메인 () 전화 외에 무언가를하기 위해 무언가를하고 싶은 다른 상황에서는 유용합니다 (예를 들어, 우리가하고있는 경우에 따라 com 상호 운용성 및 실제로 문자열 배열 대신 com 핸들을 main ()로 전달합니다).

따라서 길고 짧은 : 정적 인 이유는 B/C입니다. 편리합니다. '메인'이라고 불리는 이유는 그것이 무언가가되어야했기 때문입니다. Main ()은 C의 옛날에 한 일입니다 (그리고 그 당시에는 기능의 이름입니다. ~였다 중요한). java.exe는 클래스 (Java com.mycompany.foo.somescialmain) 대신에 완전히 자격을 갖춘 기본 메소드 이름을 지정할 수 있다고 생각합니다. 프로젝트에서 발사 가능한 '클래스.

그만큼 main() 방법 C++, C# 그리고 Java 정적입니다
그런 다음 런타임 엔진으로 호출 할 수 있기 때문에 없이 물체를 인스턴스화 한 다음 본문의 코드를 인스턴스화해야합니다. main() 나머지는 할 것입니다.

왜 공개 정적 무효 메인 (String [] args)?

이것이 Java 언어가 설계되고 Java Virtual Machine이 설계되고 작성된 방식입니다.

Oracle Java 언어 사양

체크 아웃 12 장 실행 - 섹션 12.1.4 Test.main을 호출합니다:

마지막으로, 클래스 테스트의 초기화가 완료된 후 (다른 결과적인 로딩, 링크 및 초기화가 발생할 수 있음) 테스트의 메소드가 호출됩니다.

메소드 메인은 공개, 정적 및 무효로 선언해야합니다. 문자열 배열 인 단일 인수를 받아 들여야합니다. 이 방법은 어느 쪽이든 선언 할 수 있습니다

public static void main(String[] args)

또는

public static void main(String... args)

Oracle Java 가상 머신 사양

체크 아웃 2 장 Java 프로그래밍 언어 개념 - 섹션 2.17 실행:

Java Virtual Machine은 일부 지정된 클래스의 메소드 메소드를 호출하여 하나의 인수를 전달하여 실행을 시작합니다. 이로 인해 지정된 클래스가로드되고 (§2.17.2), 링크 된 (§2.17.3)가 사용하는 다른 유형에 링크되어 초기화됩니다 (§2.17.4). 메소드 메인은 공개, 정적 및 무효로 선언해야합니다.

Oracle OpenJDK 소스

Source Jar를 다운로드하여 추출하고 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에서 생성자는 인스턴스가 초기화 제대로. 초기화 후 인스턴스를 의도 한 "서비스"에 사용할 수 있습니다. 전체 응용 프로그램 코드를 생성자에 넣으면이를 망칠 수 있습니다.

그래서이 접근법은 강요 될 것입니다 응용 프로그램에 따라 다른 계약 :

  • 거기 ~ 해야 하다 기본 생성자입니다. 그렇지 않으면 JVM은 호출 할 생성자와 어떤 매개 변수를 제공 해야하는지 알지 못합니다.
  • 거기 ~ 해야 하다 a main 방법1. 좋아, 이것은 놀라운 일이 아닙니다.
  • 클래스 안됩니다 ~이다 abstract. 그렇지 않으면 JVM이 인스턴스화 할 수 없었습니다.

그만큼 static 반면에 접근하면 필요합니다 하나 계약:

  • A가 있어야합니다 main 방법1.

여기 둘 다 abstract 다수의 생성자도 중요하지 않다.

Java는 간단한 언어로 설계 되었기 때문에 사용자를 위해 응용 프로그램 입력 지점이 간단한 방식으로 설계된 것은 놀라운 일이 아닙니다. 하나 복잡한 방식으로 계약이 아닙니다 독립적이고 부서지기 쉬운 계약.

참고 :이 주장은입니다 ~ 아니다 JVM 내부 또는 JRE 내부의 단순성에 대해. 이 주장은 사용자.


1여기서 전체 서명은 단 하나의 계약으로 간주됩니다.

그렇지 않은 경우 둘 이상의 경우 어떤 생성자를 사용해야합니까?

Java 프로그램의 초기화 및 실행에 대한 추가 정보가 있습니다. 자바 언어 사양.

기본 방법이 호출되기 전에 객체가 인스턴스화되지 않습니다. 정적 키워드를 갖는 것은 먼저 객체를 만들지 않고도 메소드를 호출 할 수 있음을 의미합니다.

그렇지 않으면 실행해야 할 객체의 인스턴스가 필요하기 때문입니다. 그러나 대체를 먼저 구성하지 않고 처음부터 호출되어야합니다. 일반적으로 Main () 함수 (bootstrap)의 작업이므로 일반적으로 이러한 인수/프로그램 매개 변수를 사용하여 인수를 구문 분석하고 객체를 구성하는 것이기 때문입니다.

의 의미는 무엇입니까 public static void main(String args[])?

  1. public 액세스 지정자이며 JVM (Java Virtual Machine과 같은 액세스/호출 할 수 있습니다.
  2. 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 */
        }
    }
    

    마찬가지로, 우리는 객체를 만들 필요가 없도록 사용자 정의 메소드에 언젠가 정적을 사용합니다.

  3. void 임을 나타냅니다 main() 선언 된 방법은 값을 반환하지 않습니다.

  4. String[] args 에서 유일한 매개 변수를 지정합니다 main() 방법.

    args - 클래스 유형의 객체 배열을 포함하는 매개 변수 String.

이런 것들을 훨씬 더 간단하게 설명하겠습니다.

public static void main(String args[])

애플릿을 제외한 모든 Java 응용 프로그램은 main().

키워드 public 액세스 수정 자로 구성원이 클래스 외부에서 부름을 호출 할 수 있습니다.

static 허용하기 때문에 사용됩니다 main() 해당 클래스의 특정 인스턴스를 인스턴스화하지 않고도 호출됩니다.

void 그것을 나타냅니다 main() 값을 반환하지 않습니다.

다양한 종류의 애플릿, 미드 렛, 서블릿 및 콩이 만들어지고 수명주기 방법이 호출됩니다. 메인을 호출하는 것은 메인 클래스에 수행 된 모든 것이므로 여러 번 불리는 객체에서 상태를 유지할 필요가 없습니다. 다른 클래스에서 Main을 고정하는 것은 매우 정상입니다 (좋은 아이디어는 아니지만) 클래스를 사용하여 기본 객체를 만드는 데 방해가됩니다.

그것은 단지 컨벤션 일 뿐이지 만 대안보다 더 편리 할 것입니다. 정적 메인을 사용하면 Java 프로그램을 호출하기 위해 알아야 할 것은 클래스의 이름과 위치입니다. 정적이 아니었다면 해당 클래스를 인스턴스화하는 방법을 알아야하거나 클래스에 빈 생성자가 있어야합니다.

기본 메소드가 정적이 아닌 경우 프로그램 외부에서 메인 클래스의 객체를 만들어야합니다. 어떻게 하시겠습니까?

JVM (Java Virtual Machine)을 java 명령,

java ClassName argument1 argument2 ...

애플리케이션을 실행할 때 위와 같이 클래스 이름을 Java 명령에 대한 인수로 지정합니다.

JVM은 지정한 클래스의 주요 방법을 호출하려고 시도합니다.

-이 시점에서 클래스의 객체가 만들어지지 않았습니다.

선언 main 정적으로 allows JVM TO invoke 기본 without 생성 instance 수업의.

명령으로 돌아 갑시다

ClassName a command-line argument 어떤 클래스를 실행 해야하는지 알려주는 JVM에. 클래스 이름에 따라 a를 지정할 수도 있습니다 list of Strings (공간별로 분리) JVM이 응용 프로그램에 전달한다는 명령 줄 인수로. -Such 인수는 응용 프로그램을 실행하기 위해 옵션 (예 : 파일 이름)을 지정하는 데 사용될 수 있습니다. String[] args 메인에

참조 :Java ™ 프로그램 방법 (초기 개체), 10 판

키워드 'static'은 주요 방법을 클래스 메소드로 만들고 클래스 메소드에는 하나의 사본 만 가지고 있으며 모두가 공유 할 수 있으며 참조 할 객체가 필요하지 않습니다. 따라서 드라이버 클래스가 컴파일되면 기본 메소드를 호출 할 수 있습니다. (난 그냥 자바의 알파벳 수준에있어, 내가 틀렸다면 미안 해요)

main ()은 정적이기 때문에; 애플리케이션 수명주기 의이 시점에서 응용 프로그램 스택은 아직 인스턴스화되지 않았기 때문에 본질적으로 절차 적입니다.

깨끗한 슬레이트입니다. 객체가 선언되지 않더라도이 시점에서 응용 프로그램이 실행 중입니다 (절차 및 OO 코딩 패턴이 있음을 기억하십시오). 개발자로서 객체의 인스턴스를 만들고 내부에 컴파일 된 코드에 따라 응용 프로그램을 객체 지향 솔루션으로 전환합니다.

객체 지향은 수백만 가지의 명백한 이유에 적합합니다. 그러나 대부분의 VB 개발자가 코드에서 "goto"와 같은 키워드를 정기적으로 사용한 시대는 사라졌습니다. "Goto"는 VB의 절차 적 명령으로, OO 상대로 대체됩니다 : 메소드 호출.

정적 진입 점 (메인)을 순수한 자유로 볼 수도 있습니다. Java가 객체를 인스턴스화하고 실행 중에 해당 인스턴스 만 제시 할 수있을만큼 다른 경우에는 절차 앱을 작성하는 것 외에는 선택의 여지가 없습니다. Java에게는 소리가 들리지 않는 것처럼 절차 적 접근을 요구하는 많은 시나리오가있을 수 있습니다.

이것은 아마도 매우 모호한 대답 일 것입니다. "클래스"는 단지 상호 관련 코드 모음 일뿐입니다. "인스턴스"는 해당 계급의 고립되고 살고 숨 쉬는 자율적 세대입니다.

Protoype public static void main(String[]) 에 정의 된 협약입니다 JLS :

메소드 메인은 공개, 정적 및 무효로 선언해야합니다. 선언 된 유형이 문자열 배열 인 공식 매개 변수 (§8.4.1)를 지정해야합니다.

JVM 사양에서 5.2. 가상 기계 시작 우리는 읽을 수 있습니다 :

Java Virtual Machine은 부트 스트랩 클래스 로더 (§5.3.1)를 사용하여 구현 의존적 방식으로 지정된 초기 클래스를 생성하여 시작합니다. Java Virtual Machine은 초기 클래스를 연결하고 초기화하고 호출합니다. 공개 클래스 방법 무효 메인 (String []). 이 방법의 호출은 모든 추가 실행을 유도합니다. 기본 방법을 구성하는 Java 가상 머신 지침의 실행은 추가 클래스 및 인터페이스의 연결 (및 결과적으로 생성)과 추가 방법의 호출을 유발할 수 있습니다.

재미있는 것은 JVM 사양에서 주요 방법이 정적이어야한다는 것은 언급되지 않습니다. 그러나 사양에 따르면 Java 가상 머신은 2 단계 전에 수행한다고 말합니다.

클래스 또는 인터페이스의 초기화는 클래스 또는 인터페이스 초기화 방법을 실행하는 것으로 구성됩니다.

~ 안에 2.9. 특별한 방법 :

클래스 또는 인터페이스 초기화 방법 정의됩니다 :

클래스 또는 인터페이스에는 최대 하나의 클래스 또는 인터페이스 초기화 방법이 있으며 해당 메소드를 호출하여 초기화 (§5.5). 클래스 또는 인터페이스의 초기화 방법에는 특별한 이름이 있습니다. <clinit>, 논쟁을 취하지 않으며 무효입니다.

그리고 a 클래스 또는 인터페이스 초기화 방법 An과 다릅니다 인스턴스 초기화 방법 다음으로 정의 :

Java Virtual Machine 수준에서 Java 프로그래밍 언어 (JLS §8.8)로 작성된 모든 생성자는 특수 이름을 가진 인스턴스 초기화 방법으로 나타납니다. <init>.

따라서 JVM은 초기화합니다 클래스 또는 인터페이스 초기화 방법 그리고 아닙니다 인스턴스 초기화 방법 그것은 실제로 생성자입니다. 따라서 기본 메소드가 주 방법을 호출하기 전에 인스턴스가 생성되지 않았다는 사실에 의해 암시되기 때문에 JVM 사양에서 주요 방법이 정적이어야한다고 언급 할 필요는 없습니다.

최근에 비슷한 질문이 Programmers.se에 게시되었습니다

tl; dr 받아 들여진 답변의 일부는

Java에서는 이유입니다 public static void main(String[] args) 그게 다

  1. 거위 새끼 원해
  2. C에서 경험 한 사람이 작성한 코드 (Java가 아님)
  3. 달리기에 익숙한 사람이 처형하기 위해 추신 ~에 소식

http://i.stack.imgur.com/qcmzP.png

 
C#의 경우, 추론은입니다 일시적으로 비슷합니다 말하자면. 언어 디자이너는 프로그램 진입 지점 Java에서 오는 프로그래머에게 친숙한 구문. C# 아키텍트로서 Anders Hejlsberg가 그것을 넣었습니다,

... C#과의 접근 방식은 단순히 대안을 제공하는 것이 었습니다 ... Java 프로그래머에게 ...

...

그것은 단지 컨벤션 일뿐입니다. JVM은 비 정적 주요 방법이 컨벤션이었을 경우 확실히 비 정적 주요 방법을 다룰 수 있습니다. 결국, 클래스에서 정적 이니셜 라이저를 정의하고 main () 메소드에 도달하기 전에 Zillion 객체를 인스턴스화 할 수 있습니다.

그만큼 public 키워드는 액세스 수정 자로 프로그래머가 클래스 멤버의 가시성을 제어 할 수 있습니다. 클래스 멤버가 앞서있을 때 public, 해당 멤버는 선언 된 클래스 이외의 코드로 액세스 할 수 있습니다.

와 반대 인 public ~이다 private, 이는 회원이 클래스 외부에서 정의 된 코드로 사용되는 것을 방지합니다.

이 경우 main() 다음과 같이 선언해야합니다 public, 프로그램이 시작될 때 클래스 이외의 코드로 호출되어야하므로.

키워드 static 허용main() 클래스의 특정 인스턴스를 인스턴스화하지 않고도 호출됩니다. 이것은 이후로 필요합니다 main() 객체를 만들기 전에 Java 통역사가 호출합니다.

키워드 void 단순히 컴파일러를 알려줍니다 main() 값을 반환하지 않습니다.

모든 응용 프로그램에 대한 실제 진입 점은 정적 방법입니다. Java 언어가 인스턴스 메소드를 "진입 점"으로 지원 한 경우 런타임은 내부적으로 객체의 인스턴스를 구성한 다음 인스턴스 메소드를 호출 한 정적 메소드로 내부적으로 구현해야합니다.

이를 통해 다음 세 가지 옵션 중 하나를 선택한 이론적 근거를 검토하겠습니다.

  1. static void main() 우리가 오늘 볼 수 있듯이.
  2. 인스턴스 방법 void main() 새로 구성된 물체를 호출했습니다.
  3. 유형의 생성자를 진입 점으로 사용합니다 (예 : 항목 클래스가 호출 된 경우 Program, 그러면 실행은 효과적으로 구성됩니다 new Program()).

고장:

static void main()

  1. Enclosing 클래스의 정적 생성자를 호출합니다.
  2. 정적 메소드를 호출합니다 main().

void main()

  1. Enclosing 클래스의 정적 생성자를 호출합니다.
  2. 효과적으로 호출하여 동봉 클래스의 인스턴스를 구성합니다. new ClassName().
  3. 인스턴스 메소드를 호출합니다 main().

new ClassName()

  1. Enclosing 클래스의 정적 생성자를 호출합니다.
  2. 클래스의 인스턴스를 구성합니다 (그런 다음 아무것도하지 않고 단순히 돌아옵니다).

이론적 해석:

나는 이것을 위해 반대로 갈 것이다.

Java의 디자인 목표 중 하나는 좋은 객체 지향 프로그래밍 관행을 강조 (필요)하는 것이 었습니다. 이러한 맥락에서, 물체의 생성자 초기화 대상은 대상의 동작에 책임이 없어야합니다. 따라서 진입 점을 제공하는 사양 new ClassName() 모든 애플리케이션에서 "이상적인"생성자의 설계에 대한 예외를 제외하여 새로운 Java 개발자의 상황을 혼동 할 것입니다.

만드는 것으로 main() 인스턴스 방법, 위의 문제는 확실히 해결됩니다. 그러나 사양이 항목 클래스 생성자의 서명을 나열하도록 요구함으로써 복잡성을 만듭니다. main() 방법.

요약해서 말하자면, 지정 a static void main() 동작을 방법에 넣는 원리를 준수하면서 최소 복잡성을 가진 사양을 만듭니다.. 구현하는 것이 얼마나 간단한 지 고려합니다 main() 클래스의 인스턴스를 구성하고 인스턴스 메소드를 호출하는 메소드는 지정할 수있는 실질적인 이점이 없습니다. main() 인스턴스 방법으로.

정적 - JVM이 기본 메소드를 호출 할 때 클래스가 호출되는 클래스에 대한 객체가 없으므로 클래스에서 호출 할 수있는 정적 메소드가 있어야합니다.

객체가 인스턴스화되기 전에 JVM이 기본 메소드를 호출하는지 모르겠지만 ... Main () 메소드가 정적 인 이유가 훨씬 더 강력한 이유가 있습니다 ... JVM이 클래스의 주요 메소드를 호출 할 때 ( , 사람). "person.main ()". JVM은 클래스 이름으로 호출합니다. 이것이 Main () 메소드가 정적이고 공개되어 JVM에서 액세스 할 수있는 이유입니다.

도움이 되었기를 바랍니다. 그렇다면 댓글을 달아 알려주십시오.

정적 메소드에는 객체가 필요하지 않습니다. 직접 실행되므로 메인이 직접 실행됩니다.

기본 메소드의 정적 키 단어는 기본 메소드에서 발생하는 인스턴스화가 없기 때문에 사용됩니다. 그러나 객체는 기본 메소드에서 정적 키워드를 사용하여 호출보다는 구성됩니다. JVM에서 클래스로드 될 때 컨텍스트 메모리가 생성되며 모든 정적 멤버가 해당 메모리에 존재합니다. 우리가 메인 정적을 지금 만들면 메모리에 있고 jvm (class.main (..))에 액세스 할 수 있으므로 힙 생성이 필요하지 않은 주요 방법을 호출 할 수 있습니다.

우리가 여기서 볼 수있는대로 컨벤션 일뿐입니다.

방법 공개 및 정적으로 선언해야합니다, 값을 반환해서는 안되며 매개 변수로 문자열 배열을 수락해야합니다. 기본적으로, 첫 번째 비 옵션 인수는 호출 될 클래스의 이름입니다. 완전히 자격을 갖춘 클래스 이름을 사용해야합니다. -JAR 옵션이 지정된 경우 첫 번째 비 옵션 인수는 응용 프로그램에 대한 클래스 및 리소스 파일을 포함하는 JAR 아카이브의 이름이며, 시작 클래스는 메인 클래스 매니페스트 헤더로 표시됩니다.

http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/java.html#description

공개 정적 무효 키워드는 JVM (Java Virtual Machine)이 프로그램의 주요 방법을 호출하여 클래스 (STATIC)의 인스턴스를 만들지 않고 프로그램 (공개)을 시작할 수 있으며 프로그램은 Java VM 통역사에게 데이터를 반환하지 않습니다. (void) 끝날 때.

원천:Essentials, Part 1, 레슨 2 : 응용 프로그램 구축

기본적으로 우리는 해당 데이터 구성원과 멤버 기능을 객체와 관련된 작업을 수행하지 않는 정적으로 만듭니다. 그리고 기본 방법의 경우, 우리는 객체와 관련이 없기 때문에 정적으로 만들고 있습니다. 주요 방법은 객체를 만들 든 아니든 항상 실행되므로 항상 실행되기 때문입니다.

Java에서 정적으로 선언 된 모든 방법은 클래스 자체에 속합니다. 다시 특정 클래스의 정적 메소드는 같은 클래스를 참조 하여만 액세스 할 수 있습니다. Class_name.method_name();

따라서 정적 메소드에 액세스하기 전에 클래스를 인스턴스화 할 필요는 없습니다.

따라서 메인 () 메소드는 다음과 같이 선언됩니다 static 해당 클래스의 객체를 만들지 않고 액세스 할 수 있습니다.

우리는 주요 방법이 존재하는 클래스 이름으로 프로그램을 저장하기 때문에 (또는 프로그램이 실행을 시작 해야하는 곳에서 main() 방법 () (고급 레벨)). 위에서 언급 한 방식으로 :

Class_name.method_name();

주요 방법에 액세스 할 수 있습니다.

프로그램이 컴파일되면 간단히 main() 방법 String 좋아요 : main(String args[]) 언급 된 수업에서 (즉, 프로그램의 이름으로), 처음에는 해당 클래스를 인스턴스화 할 범위가 없으므로 Main () 메소드는 정적으로 선언됩니다.

에서 java.sun.com (사이트에 대한 자세한 정보가 있습니다) :

주요 방법은 Java VM 통역사에게 컨트롤 클래스의 인스턴스를 먼저 만들지 않고 클래스를 시작하는 방법을 제공하는 정적입니다. 제어 클래스의 인스턴스는 프로그램이 시작된 후 기본 메소드에서 생성됩니다.

내 이해는 항상 정적 방법과 마찬가지로 주요 방법이 관련 클래스의 인스턴스를 만들지 않고 호출 할 수 있다는 것이 단순히 프로그램의 다른 어떤 것보다 먼저 실행할 수 있다는 것입니다. 정적이 아니었다면, 호출하기 전에 객체를 인스턴스화해야합니다. 이는 '닭고기와 계란'문제가 발생합니다. 주요 방법은 일반적으로 프로그램 시작시 객체를 인스턴스화하는 데 사용하는 것이기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top