Un tableau de chaînes peut être déclaré et initialisé de la manière suivante:
String[] str = {"A", "B"};
mais pour une méthode qui accepte un tableau String en argument, pourquoi ne pas utiliser la même chose ici?
Par exemple: si dans le code ci-dessous, je remplace l'appel à show () de show(str);
à show({"A" "B"});
, il indique une erreur plus complète. Pourquoi?
public class StringArray {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] str = {"A", "B"};
show(str);
}
static void show(String[] s) {
System.out.println(s[0] + s[1]);
}
}
Les erreurs de compilation montrées sont:
StringArray.Java:9: illegal start of expression
show({"A", "B"});
^
StringArray.Java:9: ';' expected
show({"A", "B"});
^
StringArray.Java:9: illegal start of expression
show({"A", "B"});
^
StringArray.Java:9: ';' expected
show({"A", "B"});
^
StringArray.Java:9: illegal start of type
show({"A", "B"});
^
StringArray.Java:11: class, interface, or enum expected
static void show(String[] s) {
^
StringArray.Java:13: class, interface, or enum expected
}
^
7 errors
De même, utiliser show(new String[] {"A", "B"});
est autorisé. En quoi new String[]{"A", "B"}
est-il différent de {"A", "B"}
lorsque vous les transmettez en tant qu'arguments de méthode? Merci d'avance!
La syntaxe {"A", "B"}
(sans new String[]
devant elle) ne peut être utilisée que comme expression d'initialisation de tableau. Dans tous les autres contextes (y compris les appels de méthodes), vous devez utiliser l'opérateur new
.
Voir le Tutoriel Java sur les tableaux pour plus d’informations.
String[] str = {"A", "B"};
est une version simplifiée de String[] str = new String[]{"A", "B"};
, le compilateur ne connaît pas la nature de {"A", "B"}
sous forme de tableau de chaînes, à moins que vous le mentionniez explicitement.
Lorsque vous passez {"A", "B"}, aucun objet n'y est référencé car ce tableau n'est pas encore créé en mémoire et cette référence doit être passée . Mais nous pouvons passer une chaîne telle que "A "directement [sans référence] à une méthode acceptant String, car String est l’objet spécial de Java pour lequel le pool String est conservé. et ce n'est pas le cas avec tableau qui ressemble à un simple objet Java.
Dans l'exemple ci-dessus, la signature de la méthode show () indique au compilateur qu'il attend une référence String au moment de l'appel. Nous ne pouvons donc transmettre qu'une variable de référence de type String lors de l'appel de la méthode show (). D'autre part, {"A", "B"} est simplement une expression et non une référence, c'est pourquoi il génère une erreur de compilation du type "Début illégal d'expression".
Puisque String[] str = {"A", "B"};
définit qu'il s'agit d'un tableau de chaînes, {"A", "B"}
n'indique nulle part qu'il s'agit d'un tableau de chaînes, car un tableau d'objets pourrait également être défini, ainsi le compilateur ne sait pas à quel type de tableau vous faites référence :)
Cela fonctionne si vous le faites comme ça
public class StringArray
{
/**
* @param args
*/
public static void main(String[] args)
{
show(new String[]{"A", "B"});
}
static void show(String[] s)
{
System.out.println(s[0] + s[1]);
}
}
parce que vous créez réellement un nouveau tableau "objet". L’autre façon, {"A", "B"} ne veut rien dire. {"A", "B"} n'est pas un objet tableau, donc cela ne fonctionnera pas. La première méthode fonctionne parce que vous spécifiez en fait que ce qui est transmis à la fonction est un objet tableau.
show ({"A" "B"}); cette expression ne passe pas d'objet de tableau. Passer un objet tableau Vous devez d'abord déclarer et initialiser l'objet tableau, puis passer une référence à une méthode.
String [] str = {"A", "B"}; Show (str);
OR
String [] str = {"A", "B"}; Show (new String [] {"A", "B"});