2015-06-20 21 views
6

Qual è la differenza tra String... args e String[] args in Java?C'è qualche differenza tra String ... args e String [] args in Java?

Sono nuovo alla programmazione Java. Qualcuno può dirmi qual è la differenza tra (String....args) & (String [] args) Se userò il primo al posto del secondo ........ Fa alcuna differenza?

String... args dichiarerà un metodo che prevede un numero variabile di argomenti String. Il numero di argomenti può essere qualsiasi cosa: compreso zero.

String[] args e l'equivalente String args[] dichiarerà un metodo che prevede esattamente un argomento: una matrice di stringhe.

Una differenza che potrebbe non scaturire da quelle osservazioni è che nel secondo caso (ma non il primo) il chiamante potrebbe avere un riferimento alla matrice. In entrambi i casi il metodo funziona con args come array di stringhe, ma se fa cose come scambiare gli elementi dell'array, questo non sarà visibile al chiamante se viene utilizzato il modulo String... args.

+1

Questa è una buona domanda, ma sembra che sia stata chiesta molte volte prima. Vedi http://stackoverflow.com/questions/301563/difference-fnstring-args-vs-fnstring-args – hungryghost

risposta

7

Non c'è differenza. E String... args è permesso.

JLS-12.1.4. Invoke Test.main dice (in parte)

Il principale metodo deve essere dichiarato public, static e void. Deve specificare un parametro formale (§8.4.1) il cui tipo dichiarato è array di String. Pertanto, uno dei seguenti dichiarazioni è accettabile:

public static void main(String[] args) 


public static void main(String... args) 

non esplicitamente elencate (ma anche permessi)

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

Vorrei semplicemente inserire l'ultimo modulo, sebbene tecnicamente consentito e valido, che la forma 'String []' sia generalmente preferibile perché le parentesi indicano che il tipo di parametro effettivo è 'String []' e il nome del parametro è un riferimento a un oggetto di tipo 'String []'.Più di una preferenza di convenzione immagino ... –

1

Nel metodo mainv'è molto poca differenza, entrambi funzioneranno allo stesso modo.

Stringa ... è noto come vararg. Il vantaggio di varargs è lo zucchero sintattico molto carino che ti consente di definire indefinitamente gli argomenti di una chiamata al metodo. Nel corpo del metodo, varargs è trattato esattamente come una matrice del tipo.

Lo svantaggio di varargs è che Java convertirà gli argomenti indefiniti in un nuovo array, creando in tal modo garbage. In alternativa, è possibile utilizzare l'overloading dei metodi per emulare varargs se la creazione di dati inutili deve essere zero.

14

Se si dispone del metodo void x(String...args), è possibile chiamarlo come x("1", "2", "3") mentre void x(String[] args) può essere chiamato solo come x(new String[] {"1", "2", "3"}).

+0

Questa è la migliore risposta. Mostra chiaramente la differenza di sintassi/utilizzo. – hungryghost

+0

L'OP @hungryghost ha chiesto in particolare su 'main' (e ha anche taggato la domanda [tag: main]). –

+0

@ElliottFrisch, la domanda in sé non menziona 'main', anche se vedo che è taggato in questo modo. 'String ... args' vs' String [] args' è più una domanda generale di Java, ma se l'OP si sta chiedendo specificamente come principale, la risposta risponde bene. Invierò anche il tuo (anche se l'intera domanda è un dup per cominciare)! ;) – hungryghost