2015-06-20 15 views
6

Jaka jest różnica między String... args i String[] args w Javie?Czy istnieje jakaś różnica między argumentami String ... args i String [] w języku Java?

Jestem nowy w programowaniu w języku Java. Czy ktoś może mi powiedzieć, jaka jest różnica między (String....args) & (String [] args) Jeśli użyję pierwszego w miejsce drugiego ........ Czy to ma jakieś znaczenie?

String... args zadeklaruje metodę, która oczekuje zmiennej liczby argumentów typu String. Liczba argumentów może być dowolna: w tym zero.

String[] args i odpowiednik String args[] zadeklaruje metodę, która oczekuje dokładnie jednego argumentu: tablica ciągów.

Jedną różnicą, która może nie wynikać z tych obserwacji, jest to, że w drugim przypadku (ale nie pierwszym) osoba dzwoniąca może mieć odniesienie do tablicy. W obu przypadkach metoda działa z args jako tablicą ciągów, ale jeśli robi to, jak zamiana elementów tablicy, nie będzie widoczna dla osoby dzwoniącej, jeśli użyty zostanie formularz String... args.

+1

To jest dobre pytanie, ale wygląda na to, że zostało zadane wiele razy wcześniej. Zobacz http://stackoverflow.com/questions/301563/difference-fnstring-args-vs-fnstring-args – hungryghost

Odpowiedz

7

Nie ma różnicy. Dopuszcza się także String... args.

JLS-12.1.4. Invoke Test.main mówi (w części)

metoda Głównym muszą być zadeklarowane public, static i void. Musi określać formalny parametr (§8.4.1), którego zadeklarowanym typem jest tablica o nazwie String. W związku z tym, jedną z następujących zgłoszeń jest dopuszczalna:

public static void main(String[] args) 


public static void main(String... args) 

nie są wyraźnie wymienione (ale również możliwość)

public static void main(String args[]) 
+0

Po prostu wrzucę tę ostatnią formę, chociaż technicznie dozwoloną i prawidłową, że formularz 'String []' jest ogólnie preferowane, ponieważ nawiasy wskazują, że faktycznym typem parametru jest 'String []', a nazwa parametru jest odniesieniem do obiektu typu 'String []'.Bardziej preferuję konwencję ... –

1

W głównej metody jest bardzo mała różnica oboje będą pracować w ten sam sposób.

Ciąg ... jest znany jako varargs. Plusem do varargs jest bardzo ładny cukier syntaktyczny, który pozwala na nieograniczone definiowanie argumentów do wywołania metody. W ciele metody varargs jest traktowany dokładnie jak tablica typu.

Wadą dla varargs jest to, że Java konwertuje nieokreślone argumenty do nowej tablicy, tworząc w ten sposób śmieci. Alternatywnie możesz użyć metody przeciążania, aby emulować varargs, jeśli tworzenie śmieci musi wynosić zero.

14

Jeśli masz metodę void x(String...args), możesz ją nazwać x("1", "2", "3"), a void x(String[] args) można nazwać tylko jako x(new String[] {"1", "2", "3"}).

+0

To jest najlepsza odpowiedź. Wyraźnie pokazuje różnicę w składni/użytkowaniu. – hungryghost

+0

@hungryghost OP zapytał konkretnie o 'main' (a nawet otagował pytanie [tag: main]). –

+0

@ElliottFrisch, samo pytanie nie wspomina o 'main', chociaż widzę, że jest oznaczony w ten sposób. 'String ... args' vs' String [] args' naprawdę jest bardziej ogólnym pytaniem Java, ale jeśli OP jest specjalnie zastanawia się nad głównym, twoja odpowiedź adresuje to dobrze. Ja również awansuję (nawet jeśli całe pytanie jest dupą na początek)! ;) – hungryghost

Powiązane problemy