7
votes

La méthode Varargs modifie la matrice de l'appelant au lieu de sa propre copie?

J'ai cette méthode de varargs simple qui divise chaque élément de la liste:

$ javac B.java && java B
[Ljava.lang.Object;@1242719c
[Ljava.lang.Object;@4830c221


1 commentaires

Java copie des références par valeur. Il n'appopine ni n'expose ni n'excuse les objets ni les tableaux comme arguments (ni aucune autre situation) sauf si vous le faites explicitement.


4 Réponses :


-1
votes

En fin de compte, un tableau est un objet, vous ne modifiez donc pas la référence de la matrice elle-même à la place de son contenu qui est autorisé.


2 commentaires

Oui, mais il modifie le contenu d'un tableau différent. Et ce sont des primitives, qui n'ont pas de références.


@ F1SH OP modifier les valeurs de la matrice dans la méthode. Ainsi, après l'avoir appelé sur la matrice, son contenu sera modifié.



15
votes

On dirait que vous vous êtes trompé ici:

Object[] os = new Object[]{1,2,3};
System.out.println(os);
f(os);


1 commentaires

+1 bonne prise. Il convient de mentionner que la méthode de Varargs est exactement la même chose qu'une méthode équivalente qui prend un paramètre de tableau, sauf que lorsque vous passez plusieurs arguments à la méthode Varargs, un tableau est créé pour vous.



3
votes

varargs est un type de tableau, mais avec du sucre syntaxique pour permettre une création de matrice à volée si des éléments sont transmis séparément en tant que paramètres.

C'est-à-dire que ces deux signatures sont identiques: xxx

sauf que les varargs peuvent être appelées avec des éléments distincts au lieu d'un tableau

bien sûr que la matrice sera modifiée si vous contournez le -fly création et créer un tableau vous-même pour passer.


0 commentaires

1
votes

Alors, comment alors F dans une modification du tableau de l'appelant au lieu de sa propre copie?

Cela n'a pas sa propre copie. Il a une référence à la matrice de l'appelant.


0 commentaires