webentwicklung-frage-antwort-db.com.de

Warum benötigt die Hauptmethode in Java immer Argumente?

Warum benötigt die Hauptmethode in Java immer Argumente? Warum sollten wir jedes Mal String[] args schreiben, anstatt es einfach zu schreiben, wenn wir Argumente verwenden?

Eine Methode wie diese generiert einen Main method not found-Compiler-Fehler. Da wir niemals Argumente für die Hauptmethode verwenden, sollte dies erlaubt sein.

public static void main()
{
}

Dies ist keine Interviewfrage. Es fiel mir gerade beim Programmieren ein.

24
dejavu

Grundsätzlich gibt es vier Antworten:

  1. Denn so wurde es konzipiert. Ja, ich weiß, dass das ein zirkulärer Grund ist. Aber der Punkt ist, dass dies so ist und es wird sich nicht ändern. Wenn Sie also nicht Ihre eigene Sprache entwerfen möchten, ist die Frage fraglich.

  2. Sauberkeit des Designs (auch bekannt als DRY - Prinzip). Geben Sie nicht zwei Einstiegspunktsignaturen an, wenn Sie den Job ausführen können. Und klar kann es.

  3. Semantische Einfachheit. Angenommen (hypothetisch), dass Java did sowohl die Einstiegspunkte void main(String[]) als auch void main() unterstützt. Was würde passieren, wenn eine Klasse beide Methoden definiert? Ist das ein Fehler? Wenn nicht, welche hat Vorrang, wenn Mehrdeutigkeit vorliegt? Ist das schon verwirrend?

    Indem Sie nur void main(String[]) zulassen, vermeidet das JLS das Problem.

  4. Dies ist analog zu den standardmäßigen C- und C++ - Unterschriften. (Zugegeben, einige C/C++ - Laufzeiten unterstützen auch andere nicht standardmäßige Einstiegspunkte ... aber das ist nicht gerade eine gute Sache ... IMO.)

Nichts davon bedeutet, dass es eindeutig falsch gewesen wäre, es anders zu machen. Und zum Beispiel gibt C # Ihnen alternative Signaturen und befasst sich mit dem Problem der Mehrdeutigkeit, indem der Entwickler einen anderen Einstiegspunkt festlegen muss. 

FWIW, diese Wikipedia-Seite beschreibt die "main" -Methode in mehreren Sprachen.

31
Stephen C

Da das Java-Tool, mit dem die Anwendung ausgeführt wird, nach einer main mit einer bestimmten Signatur sucht, weiß es, dass es die richtige ist. Java hat eine Methodenüberladung. Wenn Sie eine Methode suchen, müssen Sie eine ziemlich vollständige Signatur angeben. Zugegeben, das Java-Tool könnte etwas komplexeres tun (suchen Sie nach der spezifischen Signatur und suchen Sie nach keiner main und rufen Sie es auf, wenn es nur eine findet), aber das haben sich die Java-Designer nicht vorgenommen (und subjektiv, FWIW, ich denke, das ist das Beste - halte es einfach).

Sie finden die Details in der Java-Sprachspezifikation, Kapitel 12: Ausführung . Beachten Sie, dass es ab dem Zeitpunkt, als Java Variablen-Argumentlisten erhielt, möglich war, main auf zwei verschiedene Arten zu deklarieren:

public static void main(String[] args)
// or
public static void main(String... args)
5
T.J. Crowder

Es ist einfach so, wie sie es entworfen haben. Als Konsequenz könnte man sich fragen, warum sein Cousin (C #) die Main-Methode mit oder ohne Parameter zulässt, es ist nur die Art und Weise, wie sie sie entworfen haben.

Es gibt keine ernsthaften Gründe, jeder Sprachdesigner hat seine Vorlieben, welche Prinzipien Sie abonnieren sollten. Manchmal müssen wir darauf schließen oder uns daran halten (manchmal können wir die Dinge nicht in die richtige Richtung lenken).

Hmm ... das erinnert mich an das Betriebssystem, das ich gerade benutze. Vor OS X Lion können Sie die Größe nur in der rechten unteren Ecke des Fensters ändern. Das sind mehr als 28 Jahre Wartezeit, bis sie endlich die Möglichkeit haben, die Größe an den Ecken eines Fensters in ihrem Betriebssystem zu ändern.

Auch wenn ich Mac OS zu sehr mag, würde ich nicht versuchen, ihre Haltung zu verteidigen, bevor die Größe eines Fensters nur in einer Ecke geändert werden sollte. Zeloterie ist eine Sache, aber blindes Festhalten ist eine andere.

Es ist also gut, dass Sie kritisches Denken üben und nicht blindlings glauben, dass Javas wichtigste Methodensignatur der einzig richtige Weg ist


Java

C #

var p = new {
    Lastname = "Lennon",
    Firstname = "John",
    PlacesBeen = 
        new[]
        {
            new { City = "Liverpool", Country = "England" },
            new { City = "New York", Country = "US" },
            new { City = "Tokyo", Country = "Japan" }
        }
};

return Json(p);

Javascript:

var p = {
    "Lastname" : "Lennon",
    "Firstname" : "John",
    "PlacesBeen" :             
        [
            { "City" : "Liverpool", "Country" : "England" },
            { "City" : "New York", "Country" : "US" },
            { "City" : "Tokyo", "Country" : "Japan" }
        ]
};

Infolgedessen wird mit der erstklassigen Eigenschaft von C # (die nicht an die Methode gebunden ist) und dem Auflistungsinitialisierer nicht nur der Code kurz und bündig, sondern ähnelt auch sehr stark dem, was die meisten Entwickler derzeit für das Datenaustauschformat verwenden, d. H. JSON.

Die Syntax des Java-Objektinitialisierers ist weit vom JSON-Stil entfernt. Ich werde Javas Entwurfsentscheidung (z. B. Eigenschaftssyntax/Entwurf) in dieser Hinsicht nicht verteidigen :-)

In dem Sinne, dass ich die Designentscheidung des Java -Sprachdesigners für Javas Eigenschaftssyntax/-design nicht verteidigen werde, werde ich public static void main(String[] args) ツ nicht verteidigen

0
Michael Buen

Wenn JVM mit der Ausführung des Java-Programms beginnt, sucht es nach der Hauptmethode mit dieser Signatur (d. H. String-Array).

0
Android Killer