2010-02-04 6 views
17

J'ai une question sur la syntaxe de la déclaration Java main:Pourquoi la main de Java n'utilise-t-elle pas une liste d'arguments de longueur variable?

public static void main (String[] args) 

Puisque vous pouvez passer un nombre variable de chaînes lors de l'appel de la fonction principale, ne devrait pas ce être une liste d'arguments de longueur variable plutôt qu'une tableau? Pourquoi une invocation en ligne de commande de cette méthode avec une liste de paramètres de chaîne fonctionnerait-elle même? (À moins qu'il y ait un traitement en coulisses qui construit un tableau avec la liste des chaînes et passe ensuite ce tableau à la méthode principale ...?) La déclaration principale ne devrait-elle pas être quelque chose comme ça ...? -

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

Je suppose qu'il s'agit d'une préoccupation de compatibilité ascendante ... –

+0

Je ne pense pas vraiment que vous devriez appeler vous-même la fonction principale ... Elle est destinée à être appelée depuis la VM. –

+1

Je n'appelle pas la fonction principale moi-même. Je ne pensais pas que c'était possible. Je suppose que c'était vraiment une question sur le fonctionnement interne de Java ... – froadie

Répondre

31

main(String... args) et main (String[] args) sont effectivement la même chose: Qu'est-ce que vous obtenez est un tableau String. Le varargs est juste du sucre syntaxique pour l'appelant.

Je suppose que comme vous n'appelez jamais main() du code, il n'a pas été mis à jour lorsque varargs ont été introduits.

Modifier: En fait, rayez cette dernière phrase. main(String... args) est une syntaxe parfaitement valide, bien sûr. Les deux styles sont complètement interchangeables. Cela fonctionne très bien:

public class Test { 

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

} 
+4

Donc quand vous exécutez un programme à partir de la ligne de commande, vous n'êtes pas réellement directement appeler le principal? Il y a un traitement qui se produit avant que le principal est exécuté? (c'est-à-dire construire le tableau à partir des chaînes passées) – froadie

+0

Ils ne sont pas identiques. On ne peut pas appeler 'main (String [] args)' en tant que main ("aaaa") '. – fastcodejava

+3

Vous n'appelez pas la méthode main() en utilisant Java. Le runtime l'appelle pour vous. –

9

La méthode principale a été conçue pour Java 1.0.

La « ... » syntaxe a été introduite dans Java 1.5

Il est mis en œuvre au moyen d'un tableau du type que vous avez défini (je suppose, mais ... si Java 1.4 et codes de 1,5 octet sont compatibles il doit être implémenté avec des tableaux).

1

La syntaxe principale de java est antérieure à celle de varargs, qui a seulement été introduite dans java 1.5.

0

Eh bien, la 2ème syntaxe est juste une variante du 1er et oui ce serait bien mais il ne se construit pas en Java à ce point

-2

Pourquoi ça peut vous faire? Personne n'appelle la méthode principale à la main. C'est interne à Java.

EDIT: Je suppose que cela n'a pas d'importance maintenant que vous pouvez définir la méthode principale comme:

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

Mon point est toujours valide que personne n'appelle explicitement principal.

+1

Cela ne change rien à la façon dont je code. J'étais juste intéressé. – froadie

+0

sauf si vous appelez la méthode principale d'une autre classe de votre classe actuelle ... Vous voudrez peut-être faire cela, après tout. –

+3

J'appelle explicitement "main()" - théorie détruite – Pointy

5

Il n'y a pas Java principale méthode de, en fait, vous pouvez déclarer le tableau en tant que vararg dans votre principale méthode:

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

Intéressant. A en juger par les autres réponses/commentaires, je suppose que cette nouvelle syntaxe de déclaration principale a été ajoutée avec Java 1.5. Ainsi, le moteur d'exécution Java détermine, en fonction de la déclaration de votre méthode principale, si vous souhaitez passer les chaînes directement à la chaîne principale ou créer un tableau en premier? – froadie

+5

Varargs ont été introduits dans Java 5 comme sucre syntactique pour les tableaux, ce qui signifie qu'ils masquent le tableau réel, mais en dessous, c'est la même chose, ce qui explique pourquoi cela fonctionne. Voir aussi http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html –

+0

Non. Il construit toujours un tableau. C'est juste une syntaxe différente pour exprimer exactement le même code sous-jacent. Java va toujours analyser les arguments de la ligne de commande dans un tableau de chaînes, charger la classe référencée, trouver sa méthode principale et l'appeler avec les arguments. – Yuliy

1

Si pas la déclaration principale est quelque chose comme ce...?

public static void main(String... args) 

En fait, cela pourrait se faire sans problème.

Il était String [] args avant que les arguments var aient été introduits mais de nos jours les deux fonctionnent.

15

Vous pouvez déclarer principal dans les deux sens, et cela fonctionne très bien. Il n'y a pas de problèmes de «rétrocompatibilité» ou de «rééquipement». Cependant, les lecteurs de votre code peuvent trouver cela distrayant, et il est peu probable que cela améliore votre programme.

The Java Language Specification (third edition) section 8.4.1 dit que « Si le dernier paramètre formel est un paramètre variable arité de type T, il est considéré comme définir un paramètre formel de type T [] ».

La spécification du démarrage d'un programme Java se trouve dans JLS 12.2, qui fait référence au chapitre 5 de la spécification de machine virtuelle. Le VM spec section 5.2 indique que la machine virtuelle appelle une méthode de classe publique "void main(String[])". Puisque la spécification VM n'a pas de concept d'arité variable, une main déclarée en utilisant "..." satisfait à l'exigence.

Questions connexes