Frage

Die Methode Unterzeichnung eines Java main () Methode:

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

Gibt es einen Grund für diese Methode statisch sein?

War es hilfreich?

Lösung

Die Methode statisch ist, da sonst gäbe es Mehrdeutigkeit sein: der Konstruktor aufgerufen werden sollte? Vor allem, wenn Ihre Klasse sieht wie folgt aus:

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

Sollte der JVM Anruf new JavaClass(int)? Was sollte es für x passieren?

Wenn nicht, sollte die JVM instantiate JavaClass ohne eine Konstruktor-Methode ausgeführt wird? Ich denke, es sollte nicht, denn das wird einen speziellen Fall Ihre ganze Klasse - manchmal Sie eine Instanz, die nicht initialisiert wurde, und Sie müssen es in jedem Verfahren überprüfen, die genannt werden könnte

.

Es gibt einfach zu viele Grenzfälle und Unklarheiten für sie Sinn zu machen für die JVM eine Klasse zu instanziiert zu haben, bevor der Einstiegspunkt aufgerufen wird. Deshalb main statisch ist.

Ich habe keine Ahnung, warum main immer public obwohl markiert ist.

Andere Tipps

Dies ist nur Konvention. In der Tat, auch der Name main (), und die übergebenen Argumente sind rein Konvention.

Wenn Sie java.exe (oder javaw.exe unter Windows) laufen, was wirklich passiert ist, ein paar Java Native Interface (JNI) aufruft. Diese Anrufe laden Sie die DLL, die wirklich die JVM ist (das ist richtig - java.exe ist nicht die JVM). JNI ist das Werkzeug, das wir verwenden, wenn wir die virtuelle Maschine Welt zu überbrücken haben, und die Welt von C, C ++, etc ... Das gilt auch umgekehrt - es nicht möglich ist (zumindest meines Wissens) ein tatsächlich zu bekommen JVM läuft ohne JNI.

Im Grunde java.exe ist eine super einfache C-Anwendung, die über die Befehlszeile analysiert, erstellt ein neues String-Array in der JVM diese Argumente zu halten, analysiert aus den Klassennamen, den Sie als enthält Haupt () angegeben wird, verwendet JNI Anrufe die main () Methode selbst, ruft dann die Methode main (), vorbei in die neu geschaffene String-Array als Parameter zu finden. Das ist sehr, sehr viel wie das, was Sie tun, wenn Sie Reflexion von Java verwenden -. Verwendet es nur zum Verwechseln genannt native Funktion ruft stattdessen

Es wäre völlig legal für Sie Ihre eigene Version von java.exe zu schreiben (die Quelle mit dem JDK verteilt ist) und haben es etwas ganz anderes tun. In der Tat, das ist genau das, was wir mit all unseren Java-basierten Anwendungen zu tun.

Jedes unserer Java-Anwendungen hat einen eigenen Launcher. Wir haben in erster Linie das so erhalten wir ein eigenes Symbol und Prozessnamen, aber es hat sich als nützlich in anderen Situationen, in denen wir etwas neben der regulären Haupt tun wollen () nennen die Dinge gehen (zum Beispiel zu bekommen, in einem Fall tun wir COM-Interoperabilität, und wir geben tatsächlich einen COM-Griff in main () anstelle einer String-Array).

So, lang und kurz: der Grund ist es statisch ist b / c das ist praktisch. Der Grund, es ist ‚main‘ genannt wird, ist, dass es etwas sein mußte, und main () ist das, was sie in den alten Tagen von C haben (und in diesen Tagen, der Name der Funktion beträgt wichtig) . Ich nehme an, dass java.exe Sie nur erlaubt haben könnte, um einen vollqualifizierten Hauptmethodennamen angeben, statt nur die Klasse (Java com.mycompany.Foo.someSpecialMain) - aber das macht es nur schwieriger, auf IDEs automatisch erkennen dem ' startbar‘Klassen in einem Projekt.

Die main() Methode in C++, C# und Java sind statisch
Weil sie dann durch die Laufzeitmaschine aufgerufen werden, ohne , die alle Objekte dann den Code in den Körper von main() instanziiert wird den Rest.

Warum public static void main (String [] args)?

Dies ist, wie die Programmiersprache Java ist so konzipiert und Java Virtual Machine ist so konzipiert und geschrieben.

Oracle Java Language Specification

Sehen Sie sich Kapitel 12 Execution - Abschnitt 12.1.4 Invoke Test.main :

  

Schließlich, nach Abschluss der Initialisierung für Klasse-Test (während der andere Folgelade, Verknüpfen und die Initialisierung kann aufgetreten ist), wird die Methode des Haupt-Tests aufgerufen.

     

Die Methode main muss deklariert Öffentlichkeit, statisch, und nichtig werden. Es muss ein einzelnes Argument akzeptieren, die ein Array von Strings ist. Dieses Verfahren kann als deklariert werden entweder

public static void main(String[] args)
     

oder

public static void main(String... args)

Oracle Java Virtual Machine Specification

Sehen Sie sich Kapitel 2 Java Programming Language Concepts - Abschnitt 2.17 Ausführung :

  

Die Java Virtual Machine startet die Ausführung durch die Methode Haupt einiger angegebenen Klasse aufgerufen wird und sie ein einziges Argument übergeben, die ein Array von Strings ist. Dies bewirkt, dass die angegebene Klasse geladen (§2.17.2) wird, verknüpft (§2.17.3) auf andere Arten, die es verwendet, und initialisiert (§2.17.4). Die Methode main muss deklariert Öffentlichkeit, statisch, und nichtig werden.

Oracle OpenJDK Quelle

Download und extrahieren Sie die Quelle Glas und sehen, wie JVM geschrieben wird, überprüfen ../launcher/java.c, die hinter Befehl java [-options] class [args...] nativen C-Code enthält:

/*
 * 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);

... ...

Lassen Sie sich einfach so tun, als wäre die static nicht als Anwendung Einstiegspunkt erforderlich.

Eine Anwendungsklasse würde dann wie folgt aussehen:

class MyApplication {
    public MyApplication(){
        // Some init code here
    }
    public void main(String[] args){
        // real application code here
    }
}

Die Unterscheidung zwischen Konstruktorcode und main Verfahren notwendig ist, weil in OO ein Konstruktor sprechen soll nur sicherstellen, dass eine Instanz ist initialisiert richtig. Nach der Initialisierung kann die Instanz für den beabsichtigten „Service“ verwendet werden. Setzen Sie den kompletten Anwendungscode in den Konstruktor würde, dass verderben.

So würde dieser Ansatz erzwingen drei verschiedene Verträge von der Anwendung:

  • Es muss ein Default-Konstruktor sein. Ansonsten wissen die JVM nicht die Konstruktor aufrufen und welche Parameter sollten zur Verfügung gestellt werden.
  • Es muss sein eine main Methode 1 . Ok, das ist nicht überraschend.
  • Die Klasse muss nicht abstract werden. Andernfalls könnte die JVM es nicht instanziiert.

Der static Ansatz auf der anderen Seite erfordert nur ein Auftrag:

  • Es muss eine main Methode 1 sein.

Hier weder abstract noch mehr Konstruktoren Angelegenheiten.

Da Java entwickelt wurde eine einfache Sprache für den Benutzer sein ist es nicht verwunderlich, dass auch die Anwendung Einstiegspunkt ist auf einfache Art und Weise gestaltet mit ein Vertrag und nicht in komplexer Weise mit drei unabhängig und spröde Verträgen.

Bitte beachten Sie: Dieses Argument nicht um Einfachheit in der JVM oder innerhalb der JRE. Dieses Argument ist über Einfachheit für die Nutzer .


1 die komplette Unterschrift zählt als nur einen Vertrag.

Wenn es nicht ist, der Konstruktor verwendet werden soll, wenn es mehr als eine gibt?

Es gibt mehr Informationen über die Initialisierung und Ausführung von Java-Programmen in der Java Language Specification .

Bevor die wichtigste Methode aufgerufen wird, werden keine Objekte instanziiert. das Schlüsselwort static zu haben bedeutet, kann das Verfahren zunächst ohne die Schaffung alle Objekte aufgerufen werden.

Denn sonst wäre es eine Instanz des Objekts ausgeführt werden müssen. Aber es muss von Grund auf neu aufgerufen werden, ohne zuerst das Objekt zu konstruieren, da es in der Regel die Aufgabe der Funktion main () (Bootstrap) ist, die Argumente zu analysieren und die Aufgabe zu konstruieren, in der Regel durch diese Argumente / Programmparameter verwendet wird.

Was ist die Bedeutung von public static void main(String args[])?

  1. public ist ein Zugriffsbezeichner Sinn jemand es / aufrufen wie JVM (Java Virtual Machine zugreifen können.
  2. static erlaubt main(), bevor ein Objekt der Klasse aufgerufen werden, erstellt wurde. Dies ist neccesary weil main() von der JVM aufgerufen wird, bevor alle Objekte vorgenommen werden. Da es statisch ist, kann es direkt über die Klasse aufgerufen werden.

    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 */
        }
    }
    

    In ähnlicher Weise verwenden wir statisch irgendwann für Methoden Benutzer definiert, so dass wir nicht brauchen Objekte zu machen.

  3. void zeigt an, dass die main() Methode deklariert werden keinen Wert zurück.

  4. String[] args gibt den einzigen Parameter in der main() Methode.

    args -. Ein Parameter, der ein Array von Objekten der Klasse Typ String enthält

Lassen Sie mich diese Dinge in eine viel einfachere Art und Weise erklären:

public static void main(String args[])

Alle Java-Anwendungen, mit Ausnahme Applets, beginnen ihre Ausführung von main().

Das Schlüsselwort public ist ein Zugriffsmodifikator, die das Element von außerhalb der Klasse aufgerufen werden kann.

static verwendet, weil es main() erlaubt, ohne eine bestimmte Instanz dieser Klasse instanziiert mit aufgerufen werden.

void zeigt an, dass main() keinen Wert zurück.

Applets, midlets, Servlets und Bohnen verschiedener Arten sind so konstruiert und dann Lifecycle-Methoden auf sie genannt haben. Unter Berufung auf Haupt ist alles, was jemals auf die Hauptklasse durchgeführt wird, so gibt es keine Notwendigkeit für einen Zustand, in einem Objekt gehalten werden, die mehrfach aufgerufen wird. Es ist ganz normal, auf einer anderen Klasse Haupt Pin (wenn auch nicht eine gute Idee), die in der Art und Weise der Verwendung der Klasse bekommen würde das Hauptobjekt zu erstellen.

Es ist nur eine Konvention, aber wahrscheinlich bequemer als die Alternative. Mit einer statischen Haupt, alle müssen Sie wissen, ein Java-Programm aufzurufen, ist der Name und die Position einer Klasse. Wenn es nicht statisch ist, würden Sie auch wissen, wie diese Klasse zu instanziiert, oder verlangen, dass die Klasse einen leeren Konstruktor hat.

Wenn die wichtigste Methode nicht statisch sein würde, würden Sie brauchen, um ein Objekt Ihrer Hauptklasse von außerhalb des Programms zu erstellen. Wie würden Sie das tun wollen?

Wenn Sie die Java Virtual Machine ausgeführt werden (JVM) mit dem java Befehl,

java ClassName argument1 argument2 ...

Wenn Sie die Anwendung ausführen, geben Sie seinen Klassennamen als Argument für den Befehl java, wie oben

versucht die JVM die wichtigste Methode der Klasse aufrufen Sie angeben

  

-bei diesem Punkt haben keine Objekte der Klasse erstellt.

     

Deklarieren main als statischer allows die JVM Haupt invoke schaffen without   ein instance der Klasse.

Lassen Sie uns zurück auf den Befehl

ClassName ist ein command-line argument der JVM, dass es die Klasse sagt auszuführen. Nach dem Klassennamen, können Sie auch eine list of Strings angeben (getrennt durch Leerzeichen) als Befehlszeilenargumente, die die JVM auf Ihre Anwendung übergeben werden. -Such Argumente könnten Optionen verwendet werden, um anzugeben (beispielsweise einen Dateinamen), um die Applikations- dies auszuführen, warum es ein Parameter String[] args im Haupt

genannt ist

Referenzen: Java ™ So programmieren (Early Objekte ), Zehnte Ausgabe

Ich denke, das Schlüsselwort ‚statische‘ eine Klassenmethode der wichtigste Methode macht und Klassenmethoden haben nur eine Kopie davon und können von allen geteilt werden, und auch, es nicht ein Objekt als Referenz benötigen. Also, wenn der Fahrer Klasse die wichtigste Methode kompiliert wird, kann aufgerufen werden. (Ich bin nur in Alphabet Niveau von Java, sorry, wenn ich falsch liege)

main () ist statisch, weil; zu diesem Zeitpunkt im Lebenszyklus der Anwendung ist die Anwendung Stapel in der Natur prozeduralen aufgrund dort instanziiert keine Objekte noch zu sein.

Es ist ein unbeschriebenes Blatt. Ihre Bewerbung wird an dieser Stelle ausgeführt wird, auch ohne irgendwelche Gegenstände erklärt werden (denken Sie daran, es gibt verfahrens- und OO Codierungsmuster). Sie als Entwickler, drehen Sie die Anwendung in einer objektorientierten Lösung von Instanzen Ihrer Objekte und in Abhängigkeit von dem Code kompiliert innerhalb.

Erstellen

Objektorientierte ist für Millionen von offensichtlichen Gründen. Aber vorbei sind die Zeiten, als die meisten VB-Entwickler regelmäßig Schlüsselwörter wie „goto“ in ihrem Code verwendet. „Goto“ ist ein Verfahren Befehl in VB, die durch ihr OO Gegenstück ersetzt wird. Methodenaufruf

Sie können auch bei dem statischen Einstiegspunkt (Haupt-) als reine Freiheit suchen. Wäre Java unterschiedlich genug gewesen, ein Objekt zu instanziieren und nur diese Instanz Sie unter Laufe zu präsentieren, würden Sie keine andere Wahl als eine prozedurale App zu schreiben. Wie unvorstellbar, wie es für Java klingen mag, es ist möglich, es gibt viele Szenarien, die aus verfahrenstechnischen Ansätzen nennen.

Dies ist wahrscheinlich eine sehr obskure Antwort. Denken Sie daran, „Klasse“ ist nur eine Sammlung von miteinander verbundenen Code. „Instanz“ ist eine isolierte, lebt und atmen autonome Generation dieser Klasse.

Die protoype public static void main(String[]) ist eine Konvention definiert in der JLS :

  

Die Methode main muss deklariert Öffentlichkeit, statisch, und nichtig werden. Es muss einen formalen Parameter angeben (§8.4.1), deren erklärten Typ Array von String.

In der JVM-Spezifikation . Virtual Machine Inbetriebnahme können wir lesen:

  

Die Java Virtual Machine startet durch eine anfängliche Klasse zu schaffen, die bei einer Implementierung abhängig angegeben wird, den Bootstrap Class Loader mit (§5.3.1). Die Java Virtual Machine verknüpft dann die anfängliche Klasse, initialisiert sie und ruft die öffentliche Klassenmethode void main (String []) . Der Aufruf dieser Methode treibt alle weitere Ausführung. Die Ausführung der virtuellen Java-Maschine die Befehle Hauptmethode bildet verursachen Verknüpfung (und damit Schaffung) von zusätzlichen Klassen und Schnittstellen sowie Aufruf von zusätzlichen Methoden.

Komisch, in der JVM-Spezifikation erwähnt es nicht, dass die wichtigste Methode statisch sein muss. Aber die Spezifikation sagt auch, dass die virtuelle Java-Maschine ausführen 2 Schritte vor:

  

Initialisierung einer Klasse oder Schnittstelle besteht seine Klasse oder Schnittstelle Initialisierungsverfahren ausführen kann.

. Spezielle Methoden :

Klasse oder Schnittstelle Initialisierungsmethode ist definiert:

  

A-Klasse oder Schnittstelle hat höchstens eine Klasse oder Schnittstelle Initialisierungsverfahren und initialisiert (§5.5) durch dieses Verfahren aufgerufen wird. Die Initialisierung Methode einer Klasse oder Schnittstelle hat den speziellen Namen <clinit>, hat keine Argumente und ist nichtig.

Und ein Klasse oder Schnittstelle Initialisierungsmethode unterscheidet sich von einer Beispiel Initialisierungsmethode wie folgt definiert:

  

Auf der Ebene der virtuellen Java-Maschine, geschrieben jeder Konstruktor in der Programmiersprache Java (JLS §8.8) erscheint als eine Instanz Initialisierung Methode, die den speziellen Namen <init> hat.

So ist die JVM eine Klasse oder Schnittstelle Initialisierungsmethode initialisieren und nicht ein Beispiel Initialisierungsmethode das ist eigentlich ein Konstruktor. So müssen sie nicht erwähnen, dass die wichtigste Methode in der JVM-Spezifikation zu statisch sein muss, weil es durch die Tatsache angedeutet ist, dass keine Instanz erstellt werden, bevor die Haupt-Methode aufrufen.

Vor kurzem ähnliche Frage wird bei Programmers.SE gepostet

  • Warum eine statische main-Methode in Java und C #, anstatt ein Konstruktor?
      

    Sie suchen eine definitive Antwort aus einer primären oder sekundären Quelle für warum hat (vor allem) Java und C # entscheiden, eine statische Methode als Einstiegspunkt zu haben - anstatt was einer Anwendungsinstanz durch eine Instanz eines Application Klasse, mit der Einstiegspunkt ist eine geeignete Konstruktor?

TL; DR Teil der akzeptierten Antwort ist,

  

In Java, der Grund ist, dass public static void main(String[] args)

     
      
  1. Gosling wollte
  2.   
  3. die von jemandem geschrieben Code erlebte in C (nicht in Java)
  4.   
  5. , um von jemandem ausgeführt werden verwendet, um Laufe Postscript auf Nachrichten
  6.   
     
    

  
     


  Für C #, die Begründung ist transitively ähnlich sozusagen. Sprache Designer hielt die Programmeintrittspunkt Syntax vertraut für Programmierer aus Java. Als C # Architekt Anders Hejlsberg bringt es ,

     
    

... unser Ansatz mit C # ist einfach gewesen, eine Alternative zu bieten ... Java-Programmierer ...

  
     

...

Es ist nur eine Konvention. Die JVM könnte sicherlich mit nichtstatischen Hauptmethoden beschäftigen, wenn das die Konvention gewesen wäre. Schließlich können Sie eine statische Initialisierer auf Ihrer Klasse definieren, und eine Unmenge Objekte instanziiert, bevor überhaupt auf Ihre Methode main () zu bekommen.

Das public Schlüsselwort ist ein Zugriffsmodifikator, die der Programmierer Steuerung ermöglicht die Sichtbarkeit der Klassenmitglieder. Wenn ein Klassenglied durch public voraus, so dass Mitglied kann außerhalb der Klasse, in der sie deklariert wird.

von Code zugegriffen werden

Das Gegenteil von public private ist, die von einem Mitglied verhindert durch Code verwendet wird, außerhalb seiner Klasse definiert ist.

In diesem Fall main() müssen public erklärt werden, da sie aufgerufen werden muss von Code außerhalb seiner Klasse, wenn das Programm gestartet wird.

Das Schlüsselwort static erlaubt main() werden, ohne dass genannt eine bestimmte Instanz der Klasse instanziiert. Dies ist notwendig, da main() durch die Java-Interpreter aufgerufen wird, bevor alle Objekte vorgenommen werden.

Das Schlüsselwort void sagt einfach den Compiler, der einen Wert nicht zurück main().

Der wahre Einstiegspunkt für jede Anwendung ist eine statische Methode. Wenn die Java-Sprache eine Instanz-Methode als „Einstiegspunkt“ unterstützt wird, dann würde die Laufzeit benötigen sie implementieren intern als statische Methode, die eine Instanz des Objekts aufgebaut, gefolgt von der Instanz-Methode aufrufen.

Mit diesem aus dem Weg, ich werde die Gründe untersuchen, für eine bestimmte eine der folgenden drei Optionen wählen:

  1. A static void main() wie wir sehen es heute.
  2. Eine Instanzmethode void main() auf ein frisch konstruiertes Objekt genannt.
  3. Verwenden Sie den Konstruktor eines Typs als Eingangspunkt (zum Beispiel, wenn der Eintrag Klasse Program genannt wurde, dann würde die Ausführung effektiv von new Program() bestehen).

Aufteilung:

static void main()

  1. Ruft die statische Konstruktor der umgebenden Klasse.
  2. Ruft die statische Methode main().

void main()

  1. Ruft die statische Konstruktor der umgebenden Klasse.
  2. Konstruiert eine Instanz der umgebenden Klasse von new ClassName() effektiv aufrufen.
  3. Ruft die Instanz-Methode main().

new ClassName()

  1. Ruft die statische Konstruktor der umgebenden Klasse.
  2. Konstruiert eine Instanz der Klasse (dann tut nichts mit ihm und einfach zurückgibt).

Begründung:

ich für diesen einen in umgekehrter Reihenfolge gehen werden.

Beachten Sie, dass eine der Design-Ziele von Java betonen sollte (erforderlich, wenn möglich) gute objektorientierte Programmiertechniken. In diesem Zusammenhang initialisiert der Konstruktor eines Objekts das Objekt, soll aber nicht für das Objekt, das Verhalten verantwortlich. Daher ist eine Spezifikation, die einen Einstiegspunkt von new ClassName() gab die Situation für neuen Java-Entwickler durch Erzwingen eine Ausnahme von der Gestaltung eines „idealen“ Konstruktor für jede Anwendung verwirren würde.

Durch die main() eine Instanzmethode, wird das obige Problem sicher gelöst. Aber es schafft Komplexität durch die Spezifikation erfordert die Unterschrift des Einstiegsklasse Konstruktor sowie die Unterschrift des main() Verfahren zur Liste.

Insgesamt eine static void main() Angabe erstellt eine Spezifikation mit dem geringsten Aufwand, während sie an dem Grundsatz Verhalten in Methoden des Vergebens . Bedenkt man, wie einfach es ist, ein main() Verfahren zu implementieren, die selbst eine Instanz einer Klasse konstruiert und ruft eine Instanz Methode, dort zu spezifizieren main() als Instanz Methode keinen wirklichen Vorteil ist.

statisch -. Wenn die JVM einen Aufruf an die Hauptmethode macht es gibt kein Objekt, das für die Klasse besteht daher aufgerufen wird es statische Methode haben, hat Aufruf von Klasse zu erlauben

Ich weiß nicht, ob die JVM die Haupt-Methode aufruft, bevor die Objekte instanziiert werden ... Aber es gibt eine viel mächtiger Grund, warum die Methode main () statisch ist ... Wenn JVM die Hauptmethode der Anrufe Klasse (sagen wir, Person). es ruft sie durch " Person.main () ". Sie sehen, das JVM ruft es durch den Klassennamen. Deshalb ist die Methode main () sollen statisch und öffentlich sein, so dass es von der JVM zugegriffen werden.

Hoffe, es half. Wenn ja, lassen Sie mich wissen, durch Kommentierung.

Statische Methoden erfordern kein Objekt. Es läuft direkt so Hauptläufe direkt.

Der statische Schlüsselwort im Hauptverfahren verwendet wird, da es keine Instanziierung ist, die in dem Hauptverfahren nehmen. Aber Objekt ist so konstruiert, anstatt Aufruf als Ergebnis wir das statische Schlüsselwort in der Hauptmethode verwenden. In Jvm Kontextspeicher erstellt wird, wenn Klasse lädt in it.and alle statischen Mitglieder in diesem Speicher vorhanden sind. wenn wir die statische Haupt machen jetzt wird es im Speicher und kann auf Jvm (class.main (..)) zugänglich sein, so können wir die Hauptmethode mit aus Notwendigkeit rufen selbst für benötigen Heap erstellt.

Es ist nur eine Konvention, wie wir hier sehen können:

  

Die Methode müssen deklariert öffentlichen und statisch sein , muss es nicht zurück irgendwelche   Wert, und es muss eine String-Array als Parameter akzeptieren. Standardmäßig,   das erste nicht-Options-Argument ist der Name der Klasse aufgerufen werden.   Eine voll qualifizierten Klassennamen verwendet werden. Wenn die Option -jar ist   angegeben ist, ist die erste nicht-Option Argument der Name einer JAR-Archiv   enthält Klassen- und Ressourcendateien für die Anwendung, mit der   Startklasse durch den Main-Klasse Manifest-Header angegeben.

http://docs.oracle. com / JavaSE / 1.4.2 / docs / tooldocs / windows / java.html # Beschreibung

  

Die public static void Keywords bedeuten die Java Virtual Machine (JVM) Interpreter die wichtigste Methode des Programms aufrufen können das Programm (öffentlich) zu starten, ohne eine Instanz der Klasse (statisch) zu schaffen, und das Programm nicht zurück Daten an die Java VM-Interpreter (void), wenn es endet.

Quelle: Essentials Teil 1, Lektion 2: Erstellen von Anwendungen

Im Grunde machen wir diese Datenelemente und Elementfunktionen als STATIC, die keine Aufgabe zu einem Objekt verbunden sind durchzuführen. Und im Fall der Hauptmethode, wir es als STATIC machen, weil es nichts mit dem Objekt zu tun, als die wichtigste Methode immer ausgeführt, ob wir ein Objekt oder nicht erstellen.

Alle als statisch deklarierte Methode in Java gehört zu der Klasse selbst. Wieder statische Methode einer bestimmten Klasse kann durch Bezugnahme auf die Klasse wie Class_name.method_name(); nur zugegriffen werden,

So eine Klasse muss nicht vor dem Zugriff auf eine statische Methode instanziert werden.

So ist die Methode main () als static deklariert wird, so dass es, ohne ein Objekt dieser Klasse zugegriffen werden kann.

Da wir das Programm mit dem Namen der Klasse speichern, wo die Hauptmethode vorhanden ist (oder aus dem das Programm sollte seine Ausführung, anwendbar für Klassen ohne main() Methode () (Advanced Level) beginnen). So durch die oben erwähnte Art und Weise:

Class_name.method_name();

kann das Hauptverfahren zugegriffen werden.

Kurz gesagt, wenn das Programm kompiliert wird es sucht nach dem main() Verfahren mit String Argumenten wie: main(String args[]) in der Klasse erwähnt (dh durch den Namen des Programms), und da am Anfang es keinen Raum hat diese Klasse zu instanziiert , so dass die Methode main () als statisch deklariert wird.

java.sun.com (es gibt mehr Informationen auf der Website):

  

Die wichtigste Methode ist statisch dem Java VM-Interpreter, einen Weg zu geben, um die Klasse zu starten, ohne zunächst eine Instanz der Steuerklasse zu schaffen. Instanzen der Steuerklasse sind in der Hauptmethode erstellt, nachdem das Programm gestartet wird.

Mein Verständnis ist immer einfach, dass die wichtigste Methode, wie jede statische Methode kann ohne eine Instanz der zugehörigen Klasse aufgerufen werden, so dass es vor allem anderes in dem Programm auszuführen. Wenn es nicht statisch, würden Sie ein Objekt instanziiert müssen es-- vor dem Aufruf, die ein ‚Huhn und Ei‘ Problem schafft, da das Hauptverfahren im Allgemeinen ist, was Sie Objekte am Anfang des Programms instanziiert verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top