2010-02-04 18 views
17

Mam pytanie o składni deklaracji Java main:Dlaczego główna Java nie używa listy argumentów o zmiennej długości?

public static void main (String[] args) 

Ponieważ można przekazać zmienną liczbę pszczół podczas wywoływania funkcji main, nie powinno to być lista zmiennej długości argumentem raczej niż szyk? Dlaczego wywoływanie linii poleceń tej metody z listą parametrów łańcucha działało? (O ile nie ma zakulisowej obróbki, która buduje tablicę z listą ciągów, a następnie przekazuje tę tablicę do głównej metody ...?) Czy główna deklaracja nie powinna być czymś bardziej podobnym do tego ...? -

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

Zgaduję, że jest to problem kompatybilności wstecznej ... –

+0

Nie sądzę, że powinieneś sam wywoływać główną funkcję ... Jest przeznaczony do wywołania z VM. –

+1

Sam nie nazywam głównej funkcji. Nie sądziłem, że to możliwe. Domyślam się, że to było naprawdę pytanie o wewnętrzne funkcjonowanie Java ... – froadie

Odpowiedz

31

main(String... args) i main (String[] args) są skutecznie samo: Co dostajesz jest String tablicą. Varargs to po prostu syntaktyczny cukier dla dzwoniącego.

Domyślam się, że nigdy nie wołałeś main() z kodu, nie został on doposażony po wprowadzeniu varargs.

Edytuj: Właściwie zdrap ostatniego zdania. main(String... args) jest oczywiście poprawną składnią. Te dwa style są całkowicie wymienne. Działa to dobrze:

public class Test { 

    public static void main(String... args) { 
     System.out.println("Hello World"); 
    } 

} 
+4

Więc kiedy uruchamiasz program z wiersza poleceń, tak naprawdę nie jesteś bezpośrednio dzwoniąc do głównego? Czy jest jakieś przetwarzanie, które ma miejsce przed uruchomieniem głównej? (tzn. budowanie macierzy z przekazanych łańcuchów) – froadie

+0

Nie są one takie same. Nie można nazwać "main (String [] args)" jako 'main (" aaaa ")'. – fastcodejava

+3

Nie wywołujesz metody main() przy użyciu języka Java. Środowisko wykonawcze wywołuje to za Ciebie. –

9

Główna metoda została zaprojektowana dla Javy 1.0.

„...” składni został wprowadzony w Javie 1.5

Jest realizowane poprzez tablicę typu zdefiniowanego (moje przypuszczenie, ale ... jeśli Java 1.4 i 1.5 są kompatybilne kody bajt musi więc być realizowane z tablicami).

1

Główna składnia języka Java poprzedza pliki varargs, które zostały wprowadzone tylko w java 1.5.

0

Dobrze, 2. Składnia jest tylko odmianą 1 i tak byłoby miło, ale to nie jest wbudowana w Java w tym momencie

-2

Dlaczego cię to obchodzi? Nikt nie wywołuje głównej metody ręcznie. Jest wewnętrzna dla Javy.

EDIT: Myślę, że to nie ma znaczenia teraz, jak można zdefiniować jako główną metodę:

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

Mój punkt jest nadal ważna, jak nikt nie nazywa główny wyraźnie.

+1

Nie ma znaczenia, jak koduję. Byłem po prostu zainteresowany. – froadie

+0

, chyba że nazwiesz główną metodę innej klasy z twojej obecnej klasy ... W końcu możesz to zrobić. –

+3

Jednoznacznie nazywam "main()" - teoria zniszczona – Pointy

5

Jest głównym metody nr Java, w rzeczywistości można zadeklarować tablicę jako vararg w głównej metody:

public static void main(String... args) { System.out.println("Hi!"); } 
+1

Interesujące. Sądząc po innych odpowiedziach/komentarzach, myślę, że ta nowa główna składnia deklaracji została dodana z Javą 1.5. Tak więc środowisko wykonawcze Java określa, na podstawie deklaracji głównej metody, czy przekazywać ciągi bezpośrednio do głównej, czy najpierw budować tablicę? – froadie

+5

Varargs wprowadzono w Javie 5 jako cukier syntaktyczny dla tablic, co oznacza, że ​​ukrywają rzeczywistą tablicę, ale pod spodem jest to ta sama rzecz, dlatego tak działa. Zobacz także http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html –

+0

Nie. Zawsze buduje tablicę. Jest to po prostu inna składnia do wyrażania dokładnie tego samego kodu źródłowego. Java nadal będzie przetwarzać argumenty linii poleceń na tablicę łańcuchów, ładować odwoływaną klasę, znajdować główną metodę i wywoływać ją za pomocą argumentów. – Yuliy

1

nie powinien głównym deklaracja być coś bardziej jak to...?

public static void main(String... args) 

Właściwie, to można zrobić bez problemu.

To był String [] args przed wprowadzeniem var argumentów, ale obecnie obie te prace.

15

Możesz zadeklarować główną tak czy inaczej, i działa dobrze. Nie ma problemów z "kompatybilnością wsteczną" ani "modernizacją". Czytelnicy Twojego kodu mogą go jednak rozpraszać i nie ma żadnej szansy na ulepszenie twojego programu w żaden sposób.

The Java Language Specification (third edition) section 8.4.1 mówi, że „Jeżeli ostatni parametr formalny jest zmienną parametr arity typu T uważa się, aby zdefiniować parametr formalny typu T []”.

Specyfikację uruchamiania programu Java podano w dokumencie JLS 12.2, który odwołuje się do rozdziału 5 specyfikacji maszyny wirtualnej. VM spec section 5.2 mówi, że maszyna wirtualna wywołuje publiczną metodę klasy "void main(String[])". Ponieważ specyfikacja VM nie ma pojęcia o zmiennej arytmetyce, główna, która została zadeklarowana przy użyciu "...", spełnia wymóg.

Powiązane problemy