it-swarm.com.de

Warum ist die Java-Hauptmethode statisch?

Die Methodensignatur einer Javamain ()-Methode lautet:

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

Gibt es einen Grund dafür, dass diese Methode statisch ist?

465
Alotor

Die Methode ist statisch, da sonst Mehrdeutigkeit besteht: Welcher Konstruktor soll aufgerufen werden? Besonders wenn Ihre Klasse so aussieht:

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

Sollte die JVM new JavaClass(int) aufrufen? Was soll es für x geben?

Wenn nicht, sollte die JVM JavaClass instantiieren, ohne eine Konstruktormethode auszuführen? Ich denke, das sollte nicht der Fall sein, da dies Ihre gesamte Klasse auf bestimmte Fälle einschränken wird - manchmal haben Sie eine Instanz, die nicht initialisiert wurde, und Sie müssen in jeder Methode, die aufgerufen werden könnte, nachsehen.

Es gibt einfach zu viele Edge-Fälle und Unklarheiten, die für die JVM sinnvoll sind, um eine Klasse instanziieren zu können, bevor der Einstiegspunkt aufgerufen wird. Deshalb ist main statisch.

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

311
Jacob Krall

Das ist nur Konvention. Tatsächlich sind sogar der Name main () und die übergebenen Argumente eine reine Konvention.

Wenn Sie Java.exe (oder javaw.exe unter Windows) ausführen, werden einige Java-Native-Interface-Aufrufe (JNI) tatsächlich ausgeführt. Diese Aufrufe laden die DLL, die eigentlich die JVM ist (das ist richtig - Java.exe ist NICHT die JVM). JNI ist das Werkzeug, das wir verwenden, wenn wir die virtuelle Maschinenwelt und die Welt von C, C++ usw. überbrücken müssen. Das Gegenteil ist auch der Fall - es ist (zumindest meines Wissens) nicht möglich, tatsächlich eine JVM läuft ohne JNI.

Grundsätzlich ist Java.exe eine extrem einfache C-Anwendung, die die Befehlszeile analysiert, ein neues String-Array in der JVM erstellt, in dem diese Argumente gespeichert werden, der Klassenname, den Sie als main () angegeben haben, parst und die JNI-Aufrufe zum Suchen der Argumente verwendet main () - Methode selbst, ruft dann die main () - Methode auf und übergibt das neu erstellte String-Array als Parameter. Dies ist sehr, sehr ähnlich dem, was Sie tun, wenn Sie Reflection von Java aus verwenden. Stattdessen werden verwirrend benannte native Funktionsaufrufe verwendet.

Es wäre absolut legal für Sie, Ihre eigene Version von Java.exe zu schreiben (die Quelle wird mit dem JDK verteilt) und etwas ganz anderes machen zu lassen. Genau das machen wir mit all unseren Java-basierten Apps.

Jede unserer Java-Apps verfügt über einen eigenen Starter. Wir tun dies in erster Linie, so dass wir unser eigenes Symbol und einen eigenen Prozessnamen erhalten. Dies ist jedoch in anderen Situationen hilfreich, in denen wir neben dem normalen Aufruf von main () etwas unternehmen möchten, um die Dinge in Gang zu bringen (z. B. in einem Fall COM-Interoperabilität, und tatsächlich übergeben wir ein COM-Handle in main () anstelle eines String-Arrays.

Also, kurz und lang: Der Grund, warum es statisch ist, ist b/c, was praktisch ist. Der Grund, warum es "main" genannt wird, ist, dass es etwas sein musste, und main () ist das, was sie in den alten Tagen von C getan haben (und in jenen Tagen war der Name der Funktion war wichtig). Ich vermute, dass Java.exe es Ihnen erlaubt hätte, statt der Klasse (Java com.mycompany.Foo.someSpecialMain) nur einen vollständig qualifizierten Hauptmethodennamen anzugeben. Dies macht es jedoch für IDEs schwieriger, das 'zu erkennen. startbare Klassen in einem Projekt.

371
Kevin Day

Die main()-Methode in C++, C# und Java ist statisch
Da sie dann von der Laufzeit-Engine aufgerufen werden können ohne Objekte instanziieren zu müssen, erledigt der Code im Hauptteil von main() den Rest.

178
Noah Goodrich

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

So wird Java Language entwickelt und Java Virtual Machine entwickelt und geschrieben.

Oracle Java-Sprachspezifikation

Check out Kapitel 12 Ausführung - Abschnitt 12.1.4 Test.main aufrufen :

Nach Abschluss der Initialisierung für die Klasse Test (während dessen möglicherweise anderes Laden, Verknüpfen und Initialisieren aufgetreten ist), wird schließlich die Methode main von Test aufgerufen.

Die Methode main muss als public, static und void deklariert werden. Es muss ein einzelnes Argument akzeptieren, das aus einem String-Array besteht. Diese Methode kann als beides deklariert werden

public static void main(String[] args)

oder

public static void main(String... args)

Oracle Java Virtual Machine-Spezifikation

Check out Kapitel 2 Konzepte der Java-Programmiersprache - Abschnitt 2.17 Ausführung :

Die Java Virtual Machine startet die Ausführung, indem sie die Methode main einer angegebenen Klasse aufruft und ein einzelnes Argument (ein String-Array) übergibt. Dadurch wird die angegebene Klasse geladen (§2.17.2), mit anderen verwendeten Typen verknüpft (§2.17.3) und initialisiert (§2.17.4). Die Methode main muss als public, static und void deklariert werden.

Oracle OpenJDK-Quelle

Laden Sie den Quellcode herunter, extrahieren Sie ihn und sehen Sie, wie die JVM geschrieben wird. Überprüfen Sie ../launcher/Java.c, der nativen C-Code hinter dem Befehl Java [-options] class [args...] 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);

... ...
36
yorkw

Stellen wir uns einfach vor, dass static nicht als Einstiegspunkt für die Anwendung erforderlich wäre.

Eine Anwendungsklasse würde dann so aussehen:

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

Die Unterscheidung zwischen Konstruktorcode und main -Methode ist notwendig, da ein Konstruktor in OO Speak nur sicherstellen soll, dass eine Instanz ordnungsgemäß initialisiert ist. Nach der Initialisierung kann die Instanz für den beabsichtigten "Dienst" verwendet werden. Das Einfügen des vollständigen Anwendungscodes in den Konstruktor würde das verderben.

Dieser Ansatz würde dem Antrag also drei verschiedene Verträge aufzwingen:

  • Es muss einen Standardkonstruktor geben . Andernfalls würde die JVM nicht wissen, welcher Konstruktor aufgerufen werden soll und welche Parameter angegeben werden sollen.
  • Es muss eine main -Methode geben 1. Ok, das ist nicht überraschend.
  • Die Klasse darf nicht abstract sein. Andernfalls könnte die JVM sie nicht instanziieren.

Der static Ansatz erfordert dagegen nur einen Vertrag:

  • Es muss eine main -Methode geben1.

Hier sind weder abstract noch mehrere Konstrukteure von Bedeutung.

Da Java als einfache Sprache für den Benutzer konzipiert wurde, ist es nicht verwunderlich, dass auch der Anwendungseinstiegspunkt auf einfache Weise mit - erstellt wurde. eins Vertrag und nicht in komplexer Weise mit drei unabhängigen und spröden Verträgen.

Bitte beachten Sie: Bei diesem Argument handelt es sich um nicht Einfachheit innerhalb der JVM oder innerhalb der JRE. Dieses Argument handelt von der Einfachheit für Benutzer.


1
35
A.H.

Wenn nicht, welcher Konstruktor sollte verwendet werden, wenn es mehr als einen gibt?

Weitere Informationen zur Initialisierung und Ausführung von Java-Programmen finden Sie in der Java Language Specification .

13
Hank

Andernfalls müsste eine Instanz des Objekts ausgeführt werden. Es muss jedoch von Grund auf aufgerufen werden, ohne dass zuerst das Objekt erstellt werden muss, da es in der Regel Aufgabe der main () - Funktion (bootstrap) ist, die Argumente zu analysieren und das Objekt zu konstruieren, normalerweise unter Verwendung dieser Argumente/Programmparameter.

12
PhiLho

Vor dem Aufruf der Hauptmethode werden keine Objekte instanziiert. Durch das statische Schlüsselwort kann die Methode aufgerufen werden, ohne dass zuvor Objekte erstellt werden müssen.

11
BlackWasp

Was bedeutet public static void main(String args[])?

  1. public ist ein Zugriffsspezifizierer, das bedeutet, dass jeder darauf zugreifen kann, wie beispielsweise JVM (Java Virtual Machine).
  2. static ermöglicht den Aufruf von main(), bevor ein Objekt der Klasse erstellt wurde. Dies ist notwendig, da main() von der JVM aufgerufen wird, bevor Objekte erstellt 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 static manchmal für benutzerdefinierte Methoden, sodass keine Objekte erstellt werden müssen.

  3. void gibt an, dass die main()-Methode, die deklariert wird , keinen Wert zurückgibt.

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

    args - ein Parameter, der ein Array von Objekten des Klassentyps String enthält.

9

Lassen Sie mich diese Dinge auf viel einfachere Weise erklären:

public static void main(String args[])

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

Das Schlüsselwort public ist ein Zugriffsmodifizierer, mit dem der Member von außerhalb der Klasse aufgerufen werden kann.

static wird verwendet, weil main() aufgerufen werden kann, ohne dass eine bestimmte Instanz dieser Klasse instanziiert werden muss.

void gibt an, dass main() keinen Wert zurückgibt.

9
Lordferrous

Applets, Midlets, Servlets und Beans verschiedener Art werden konstruiert und anschließend mit Lebenszyklusmethoden versehen. Das Aufrufen von main ist alles, was jemals für die Hauptklasse ausgeführt wird. Daher muss kein Status in einem Objekt gespeichert werden, das mehrmals aufgerufen wird. Es ist ganz normal, main an eine andere Klasse zu knüpfen (obwohl dies keine gute Idee ist).

Es ist nur eine Konvention, aber wahrscheinlich bequemer als die Alternative. Bei einem statischen main müssen Sie zum Aufrufen eines Java-Programms nur den Namen und den Speicherort einer Klasse kennen. Wenn es nicht statisch wäre, müssten Sie auch wissen, wie diese Klasse instanziiert werden muss, oder dass die Klasse über einen leeren Konstruktor verfügt.

5
Logan

Wenn Sie die Java Virtual Machine (JVM) mit dem Befehl Java ausführen, 

Java ClassName argument1 argument2 ...

Wenn Sie Ihre Anwendung ausführen, geben Sie ihren Klassennamen als Argument für den Java-Befehl an (siehe oben)

die JVM versucht, die Hauptmethode der angegebenen Klasse aufzurufen 

- Zu diesem Zeitpunkt wurden keine Objekte der Klasse erstellt.

main als statisch allows der JVM als invoke main without deklariert. eine instance der Klasse.

kommen wir zurück zum Befehl 

ClassName ist ein command-line argument für die JVM, der die zu verwendende Klasse angibt. Nach dem ClassName können Sie auch einen list of Strings (durch Leerzeichen getrennt) als Befehlszeilenargumente angeben, den die JVM an Ihre Anwendung übergeben wird. Solche Argumente können verwendet werden, um Optionen (z. B. einen Dateinamen) zum Ausführen der Anwendung anzugeben. Aus diesem Grund gibt es einen Parameter mit dem Namen String[] args im Hauptfenster 

Referenzen: Java ™ - Programmieren (frühe Objekte), zehnte Ausgabe

5

Wenn die Hauptmethode nicht statisch ist, müssen Sie ein Objekt Ihrer Hauptklasse außerhalb des Programms erstellen. Wie möchtest du das machen?

5
micro

Kürzlich wurde eine ähnliche Frage bei Programmers.SE gepostet

  • Warum eine statische Hauptmethode in Java und C # und nicht ein Konstruktor?

    Wenn Sie nach einer endgültigen Antwort aus einer primären oder sekundären Quelle suchen, warum entschieden sich (insbesondere) für Java und C #, eine statische Methode als Einstiegspunkt zu verwenden, anstatt eine Anwendungsinstanz durch eine Instanz einer Application-Klasse zu repräsentieren, wobei der Einstiegspunkt der Fall ist ein geeigneter Konstruktor?

TL; DR Teil der akzeptierten Antwort ist,

In Java ist dies der Grund für public static void main(String[] args)

  1. Gosling gesucht
  2. der Code, der von jemandem geschrieben wurde, der in C (nicht in Java) erfahren ist
  3. wird von einer Person ausgeführt, die zum Ausführen von PostScript auf NeWS verwendet wurde.

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


Für C # ist die Begründung sozusagen durchgehend ähnlich. Sprachdesigner haben die Syntax program entry point für Programmierer, die aus Java kommen, bekannt. Wie C # -Architekt Anders Hejlsberg sagt ,

... unser Ansatz mit C # bestand einfach darin, eine Alternative zu Java-Programmierern anzubieten ...

...

3
gnat

main () ist statisch, weil; Zu diesem Zeitpunkt im Lebenszyklus der Anwendung ist der Anwendungsstapel prozeduraler Natur, da noch keine Objekte instanziiert sind.

Es ist ein sauberer Schiefer. Ihre Anwendung wird zu diesem Zeitpunkt ausgeführt, auch ohne dass Objekte deklariert werden (denken Sie daran, es gibt prozedurale AND OO - Codierungsmuster). Als Entwickler verwandeln Sie die Anwendung in eine objektorientierte Lösung, indem Sie Instanzen Ihrer Objekte erstellen und abhängig vom darin kompilierten Code.

Objektorientiert ist aus Millionen von Gründen naheliegend. Es sind jedoch keine Zeiten mehr, in denen die meisten VB - Entwickler regelmäßig Schlüsselwörter wie "goto" in ihrem Code verwendeten. "goto" ist ein prozeduraler Befehl in VB, der durch den Aufruf seiner Gegenstelle OO: ersetzt wird.

Sie können den statischen Eintrittspunkt (main) auch als reine Freiheit betrachten. Wäre Java anders genug gewesen, um ein Objekt zu instanziieren und Ihnen nur diese Instanz zur Verfügung zu stellen, hätten Sie keine andere Wahl, ABER eine prozedurale App zu schreiben. So unvorstellbar, wie es für Java klingen mag, es gibt viele Szenarien, die prozessuale Ansätze erfordern.

Dies ist wahrscheinlich eine sehr obskure Antwort. Denken Sie daran, dass "Klasse" nur eine Sammlung von zusammenhängendem Code ist. "Instanz" ist eine isolierte, lebendige und atmende autonome Generation dieser Klasse.

3

Der Prototyp public static void main(String[]) ist eine Konvention, die in JLS definiert ist:

Die Methode main muss als public, static und void deklariert werden. Es muss ein Formalparameter (§8.4.1) angegeben werden, dessen deklarierter Typ das Array von String ist. 

In der JVM-Spezifikation 5.2. Start der virtuellen Maschine wir können lesen:

Die virtuelle Java-Maschine wird gestartet, indem mithilfe des Bootstrap-Klassenladers (§5.3.1) eine anfängliche Klasse erstellt wird, die implementierungsabhängig festgelegt ist. Die Java Virtual Machine verknüpft dann die ursprüngliche Klasse, initialisiert sie und ruft die öffentliche Klassenmethode void main (String []) auf. Der Aufruf dieser Methode steuert die weitere Ausführung. Die Ausführung der Java Virtual Machine-Anweisungen, die die Hauptmethode bilden, kann das Verknüpfen (und folglich das Erstellen) zusätzlicher Klassen und Schnittstellen sowie das Aufrufen zusätzlicher Methoden verursachen.

Interessanterweise wird in der JVM-Spezifikation nicht erwähnt, dass die Hauptmethode statisch sein muss. Die Spezifikation besagt jedoch auch, dass die virtuelle Java-Maschine zuvor zwei Schritte ausführt:

Die Initialisierung einer Klasse oder Schnittstelle besteht aus der Ausführung ihrer Klassen- oder Schnittstelleninitialisierungsmethode.

In 2,9. Spezielle Methoden :

Eine Klassen- oder Schnittstelleninitialisierungsmethode ist definiert:

Eine Klasse oder Schnittstelle hat höchstens eine Klassen- oder Schnittstelleninitialisierungsmethode und wird durch Aufrufen dieser Methode initialisiert (§5.5). Die Initialisierungsmethode einer Klasse oder Schnittstelle hat den speziellen Namen <clinit>, nimmt keine Argumente an und ist ungültig.

Eine Klassen- oder Schnittstelleninitialisierungsmethode unterscheidet sich von einer Instanzinitialisierungsmethode, die wie folgt definiert ist:

Auf der Ebene der Java Virtual Machine erscheint jeder Konstruktor, der in der Java-Programmiersprache (JLS §8.8) geschrieben ist, als Instanzinitialisierungsmethode mit dem speziellen Namen <init>

Die JVM initialisiert also eine Klassen- oder Schnittstelleninitialisierungsmethode und keine Instanzinitialisierungsmethode, die eigentlich ein Konstruktor ist. Sie müssen also nicht erwähnen, dass die Hauptmethode dies hat um in der JVM-Spezifikation statisch zu sein, da dies darauf zurückzuführen ist, dass vor dem Aufruf der main-Methode keine Instanz erstellt wird.

3
alain.janinm

Ich denke, das Schlüsselwort 'static' macht aus der Hauptmethode eine Klassenmethode, und Klassenmethoden haben nur eine Kopie und können von allen gemeinsam genutzt werden. Außerdem ist kein Objekt als Referenz erforderlich. Wenn also die Treiberklasse kompiliert wird, kann die Hauptmethode aufgerufen werden. (Ich bin nur im Alphabet-Level von Java, sorry, wenn ich falsch liege.)

3
Aysha

Es ist nur eine Konvention. Die JVM könnte sicherlich mit nicht statischen Hauptmethoden umgehen, wenn dies die Konvention gewesen wäre. Schließlich können Sie einen statischen Initialisierer für Ihre Klasse definieren und eine Vielzahl von Objekten instanziieren, bevor Sie Ihre main () - Methode aufrufen.

2
Tom

Das Schlüsselwort public ist ein Zugriffsmodifizierer, mit dem der Programmierer die Sichtbarkeit von Klassenmitgliedern steuern kann. Wenn einem Klassenmitglied public vorangestellt wird, kann auf diesen -Member durch Code außerhalb der Klasse zugegriffen werden, in der er deklariert ist.

Das Gegenteil von public ist private. Dies verhindert, dass ein Member von Code verwendet wird, der außerhalb seiner Klasse definiert ist.

In diesem Fall muss main() als public deklariert werden, da er beim Starten des Programms außerhalb seiner Klasse aufgerufen werden muss.

Mit dem Schlüsselwort static kann main() aufgerufen werden, ohne dass eine bestimmte Instanz der Klasse instanziiert werden muss. Dies ist notwendig, da main() vom Java-Interpreter aufgerufen wird, bevor Objekte erstellt werden.

Das Schlüsselwort void teilt dem Compiler lediglich mit, dass main() keinen Wert zurückgibt.

1
Abhishek

static - Wenn die JVM die main-Methode aufruft, ist für die aufgerufene Klasse kein Objekt vorhanden. Daher muss sie über eine statische Methode verfügen, um den Aufruf von class zuzulassen.

1
Kero Fawzy

Der wahre Einstiegspunkt für jede Anwendung ist eine statische Methode. Wenn die Sprache Java eine Instanzmethode als "Einstiegspunkt" unterstützt, muss diese zur Laufzeit intern als statische Methode implementiert werden, die eine Instanz des Objekts erstellt und anschließend die Instanzmethode aufruft.

Nachdem dies aus dem Weg geräumt ist, werde ich die Gründe für die Auswahl einer der folgenden drei Optionen untersuchen:

  1. Eine static void main(), wie wir sie heute sehen.
  2. Eine Instanzmethode void main() hat ein neu erstelltes Objekt aufgerufen.
  3. Verwenden des Konstruktors eines Typs als Einstiegspunkt (z. B. wenn die Einstiegsklasse Program heißt, würde die Ausführung effektiv aus new Program() bestehen).

Nervenzusammenbruch:

static void main()

  1. Ruft den statischen Konstruktor der einschließenden Klasse auf.
  2. Ruft die statische Methode main() auf.

void main()

  1. Ruft den statischen Konstruktor der einschließenden Klasse auf.
  2. Erstellt eine Instanz der einschließenden Klasse, indem effektiv new ClassName() aufgerufen wird.
  3. Ruft die Instanzmethode main() auf.

new ClassName()

  1. Ruft den statischen Konstruktor der einschließenden Klasse auf.
  2. Erstellt eine Instanz der Klasse (macht dann nichts damit und kehrt einfach zurück).

Begründung:

Ich gehe in umgekehrter Reihenfolge vor.

Beachten Sie, dass eines der Entwurfsziele von Java darin bestand, gute objektorientierte Programmierpraktiken hervorzuheben (sofern möglich). In diesem Zusammenhang initialisiert der Konstruktor eines Objekts das Objekt , sollte jedoch nicht für das Verhalten des Objekts verantwortlich sein. Aus diesem Grund würde eine Spezifikation, die den Einstiegspunkt new ClassName() enthält, die Situation für neue Java Entwickler verwirren, indem in jeder Anwendung eine Ausnahme vom Entwurf eines "idealen" Konstruktors erzwungen wird.

Indem Sie main() zu einer Instanzmethode machen, wird das oben genannte Problem mit Sicherheit gelöst. Dies schafft jedoch Komplexität, indem von der Spezifikation verlangt wird, dass sie die Signatur des Konstruktors der Eintragsklasse sowie die Signatur der Methode main() auflistet.

Zusammenfassend lässt sich sagen, dass durch Angabe von static void main() eine Spezifikation mit der geringsten Komplexität erstellt wird, während das Prinzip der Einordnung von Verhalten in Methoden eingehalten wird. Wenn man bedenkt, wie einfach es ist, eine main()-Methode zu implementieren, die selbst eine Instanz einer Klasse erstellt und eine Instanzmethode aufruft, ist es kein wirklicher Vorteil, main() als Instanzmethode anzugeben.

1
Sam Harwell

Ich weiß nicht, ob die JVM die Hauptmethode aufruft, bevor die Objekte instanziiert werden ... Es gibt jedoch einen weitaus stärkeren Grund, warum die main () -Methode statisch ist ... Wenn JVM die Hauptmethode der Klasse aufruft (sprich Person). es ruft es durch " Person.main () " auf. Sie sehen, die JVM ruft sie anhand des Klassennamens auf. Aus diesem Grund soll die main () - Methode statisch und öffentlich sein, damit die JVM darauf zugreifen kann.

Hoffe es hat geholfen. Wenn ja, lass es mich durch Kommentieren wissen.

1
Vamsi Sangam

Die Hauptmethode des Programms hat das reserviertes Wortstatisch, was bedeutet, dass es im statischen Kontext verwendet werden darf. Ein Kontext bezieht sich auf die Verwendung von Computerspeicher während der Ausführung des Programms. Wenn die virtuelle Maschine ein Programm lädt, erstellt sie den statischen Kontext dafür und weist Computerspeicher zu, um das Programm und seine Daten usw. zu speichern. Ein dynamischer Kontext ist eine bestimmte Art der Speicherzuweisung, die später während des Programmablaufs vorgenommen wird. Das Programm kann nicht gestartet werden, wenn die Hauptmethode nicht im statischen Kontext ausgeführt werden darf.

0
Mayank Chopra

die main-Methode muss immer statisch sein, da JVM zu RunTime kein Objekt erstellt, um die main-Methode aufzurufen, und wie wir in Java wissen, sind statische Methoden die einzigen Methoden, die mit Klassennamen aufgerufen werden können. Daher müssen main-Methoden immer statisch sein.

weitere Informationen finden Sie in diesem Video: https://www.youtube.com/watch?v=Z7rPNwg-bfk&feature=youtu.be

0
Manish Dwivedi

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

Daher muss eine Klasse nicht instanziiert werden, bevor auf eine statische Methode zugegriffen wird.

Daher ist die main () -Methode als static deklariert, sodass auf sie zugegriffen werden kann, ohne ein Objekt dieser Klasse zu erstellen.

Da wir das Programm mit dem Namen der Klasse speichern, in der die Hauptmethode vorhanden ist (oder von wo aus das Programm seine Ausführung beginnen soll, gilt dies für Klassen ohne main()-Methode () (Advanced Level)). Also auf die oben erwähnte Weise:

Class_name.method_name();

die Hauptmethode kann aufgerufen werden.

Kurz gesagt, wenn das Programm kompiliert wird, sucht es nach der main()-Methode mit String-Argumenten wie: main(String args[]) in der genannten Klasse (dh nach dem Namen des Programms), und da es am Anfang keine Möglichkeit hat, diese Klasse zu instanziieren, so die main () -Methode wird als statisch deklariert.

0
Sourav Saha

Die public static void-Schlüsselwörter bedeuten, dass der JVM-Interpreter (Java Virtual Machine) die Hauptmethode des Programms aufrufen kann, um das Programm (public) zu starten, ohne eine Instanz der Klasse (static) zu erstellen, und das Programm gibt keine Daten an Java zurück VM Interpreter (ungültig), wenn es endet.

Quelle: Grundlagen, Teil 1, Lektion 2: Anwendungen erstellen

0
user1515855

Statische Methoden erfordern kein Objekt. Es läuft direkt, also läuft es direkt.

0
c k ravi

es gibt den einfachen Grund dahinter, dass das Objekt keine statische Methode aufrufen muss. Wenn es sich um eine nicht statische Methode handelt, erstellt die Java Virtual Machine zuerst ein Objekt und dann die Methode main (), die zu dem Problem der zusätzlichen Speicherzuordnung führt.

0
Jatin Kathuria

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

Die Methode muss als public und static deklariert werden. Sie darf keine .__ zurückgeben. Wert und muss ein String-Array als Parameter akzeptieren. Standardmäßig, Das erste Nichtoptionsargument ist der Name der Klasse, die aufgerufen werden soll . Es sollte ein vollständig qualifizierter Klassenname verwendet werden. Wenn die Option -jar .__ ist. angegeben, ist das erste Nichtoptionsargument der Name eines JAR-Archivs enthält Klassen- und Ressourcendateien für die Anwendung mit der Die durch den Manifest-Header Main-Class angegebene Startklasse.

http://docs.Oracle.com/javase/1.4.2/docs/tooldocs/windows/Java.html#description

0

Von Java.Sun.com (es gibt weitere Informationen auf der Site):

Die Hauptmethode ist static, um dem Java-Interpreter VM die Möglichkeit zu geben, die Klasse zu starten, ohne zuerst eine Instanz der Steuerungsklasse zu erstellen. Instanzen der Steuerungsklasse werden in der Hauptmethode erstellt, nachdem das Programm gestartet wurde.

Mein Verständnis war immer einfach, dass die Hauptmethode wie jede statische Methode aufgerufen werden kann, ohne eine Instanz der zugehörigen Klasse zu erstellen, sodass sie vor allen anderen im Programm ausgeführt werden kann. Wenn es nicht statisch wäre, müssten Sie ein Objekt instanziieren, bevor Sie es aufrufen. Dies führt zu einem 'Chicken and Egg'-Problem, da die Hauptmethode normalerweise die ist, mit der Sie Objekte zu Beginn des Programms instanziieren.

0
Jesse M

Grundsätzlich machen wir die DATA MEMBERS und MEMBER FUNCTIONS als STATIC, die keine mit einem Objekt zusammenhängenden Aufgaben ausführen. Und im Fall der Hauptmethode machen wir es als STATIC, weil es nichts mit Objekt zu tun hat, da die Hauptmethode immer ausgeführt wird, ob wir ein Objekt erstellen oder nicht.

0
Varun Vashista

Das statische Schlüsselwort in der Hauptmethode wird verwendet, da in der Hauptmethode keine Instantiierung stattfindet. .__ Objekt wird jedoch nicht als Aufruf erstellt, sondern als Ergebnis wird der statische Schlüssel Word in der Hauptmethode verwendet. In jvm wird der Speicher erstellt, wenn die Klasse in ihn geladen wird. In diesem Speicher sind alle statischen Member vorhanden. Wenn wir die Hauptstatik jetzt machen, wird sie sich im Speicher befinden und kann für jvm (class.main (..)) zugänglich sein, sodass wir die Hauptmethode aufrufen können, ohne dass sogar Heap erstellt werden muss.

0
eagles