2014-04-11 19 views
5

Können wir diese 3 Punkte verwenden, um ein Array an der Stelle von eckigen Klammern zu erstellen, wie wir es oben verwendet haben ?? Wenn nicht dann warum verwenden wir diese Deklaration nur für Haupt ??2 verschiedene Signaturen für Hauptmethode

public static void main(String[] args) 

or 

public static void main(String... args) 
+0

weil '[]' häufiger als '...' ist und manchmal ein bisschen leichter zu erklären ... aber natürlich arbeiten beide –

+2

'Können wir diese 3 Punkte verwenden, um ein Array an der Stelle der eckigen Klammern zu erstellen" versuchen durch Codierung .. – lakshman

+0

Sie können sie austauschbar verwenden. –

Antwort

4

Dies sind nicht zwei verschiedene Signaturen - unter der Haube, es ist die gleiche Signatur ist; Der Unterschied besteht darin, dass der Compiler drei Punkte verwendet, um Aufrufe mit variablen Argumentlisten zu ermöglichen.

Da Sie niemals main direkt anrufen (naja, Sie sollten nicht, sowieso) der Unterschied sollte Ihnen egal sein. Die erste Form der Signatur ist die erste, die Sie in den elementaren Büchern über Java sehen, daher sollte man sich an eckige Klammern halten, um "sofortige Vertrautheit" mit den Lesern Ihres Codes zu erlangen.

0

Ja Sie hier Hauptmethode sind Überlastung und beide sind erlaubt die Ausführung als Paramater Art der Haupt-Methode aufzurufen ist ein Array von String ...

Erwähnt in JLS 12.1.4

Die Methode main muss sein öffentlich deklariert, statisch und void. Es muss einen formalen Parameter angeben (§8.4.1), dessen deklarierter Typ ein Array von String ist. Daher ist eine der folgenden Erklärungen akzeptabel:

public static void main(String[] args) 

public static void main(String... args) 
0

Blick auf diese Weise. Wenn Java verwendet Reflektion, um die Haupt-Methode zu finden, wäre es so etwas wie diese (Linie 6)

public class Main { 

    public static void main(String[] args) throws Exception { 
     if (!(args.length == 1 && args[0].equals("Hello World"))) { 
      System.out.println("You did not recurse!"); 
      Main.class.getDeclaredMethod("main", String[].class).invoke(null, (Object) new String[]{"Hello World"}); 
     } else { 
      System.out.println("You recursed!"); 
     } 
    } 
} 

zu tun, es wäre eine Funktion finden erklärt mit ... oder [] dann dieser Funktion aufrufen.

1

Ich verstehe das schon beantwortet wird, aber wenn dies kann mehr helfen zu verstehen ..

Um Ihre Frage -

Können wir diese drei Punkte ein Array an dem Ort zu schaffen

von Platz Klammern

Die klare Antwort ist ja , und hier ist die Java-Dokumentation: http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs

(String... args) 

Hier ruft der Hauptthread die Hauptmethode auf, die einige Argumente übergibt. Der Typ der Parameterdeklaration ist Array, aber wenn die Methode aufgerufen wird, können Sie ein oder mehrere String-Objekte oder ein Array von String-Objekten als Parameter dieser Funktion übergeben. In diesem Fall gibt es keine Besonderheit für main().

Auch Sie könnten eine myMethod nennen (String .. args) in eine der folgenden Möglichkeiten:

myMethod(); // Likely useless, but possible 
myMethod("one", "two", "three"); 
myMethod("one"); 
myMethod(new String[]{"a", "b", "c"}); 

Wichtiger Hinweis 1: Der Parameter (n) auf diese Weise vergangen ist immer ein Array - auch wenn es nur einen gibt. Stellen Sie sicher, dass Sie es so im Methodenkörper behandeln.

Wichtiger Hinweis 2: Der Parameter, der den ... erhält, muss der letzte in der Methodensignatur sein. Also, myMethod (int i, String ... Strings) ist in Ordnung, aber myMethod (String ... strings, int i) ist nicht in Ordnung.

Sie erwähnte auch, dass Sie haben versucht, mit ‚Integer []‘ und es hat nicht funktioniert, Hier ist ein Beispiel

public static void main(String[] args) { 
     Integer[] a = new Integer[4]; 
     a[0] = 10; 
     a[1] = 20; 
     a[2] = 30; 
     a[3] = 40; 
     myMethod(a); 
    } 

    public static void myMethod(Integer... args) { 
     for (Integer i : args) { 
      System.out.println(i); 
     } 
    }