7
votes

Pourquoi ma méthode de Java ne peut-elle pas changer une variable passée?

J'étais un peu déformé quand j'ai vu le code suivant n'a pas fonctionné comme prévu.

Je pensais que Java a toujours passé des variables par des références en fonctions. Par conséquent, pourquoi la fonction ne peut-elle pas réaffecter la variable? P>

public static void main(String[] args) {

  String nullTest = null;

  setNotNull(nullTest);

  System.out.println(nullTest);
}

private static void setNotNull(String s) {
  s = "not null!";
}


1 commentaires

Cela ne veut rien dire. Vous pouvez instancier tout ce que vous pouvez instancier, mais vous ne pouvez pas modifier la valeur que l'appelant vous a transmis.


4 Réponses :


22
votes

Les références aux objets sont transmises par valeur em> en Java afin que l'attribution à la variable locale à l'intérieur de la méthode ne change pas la variable d'origine. Seule la variable locale s code> pointe vers une nouvelle chaîne. Il pourrait être plus facile de comprendre avec un petit art ASCII.

Initialement, vous avez ceci: p> xxx pré>

Lorsque vous entrez d'abord la méthode setNotnull, vous obtenez une copie de la valeur em> de nulltest dans s code>. Dans ce cas, la valeur de NullTest est une référence null: p> xxx pré>

puis réaffectation s: p> xxx pré>

puis laissez le Méthode: P>

------------
| nullTest |
------------
     |
    null


4 commentaires

Alors qu'en est-il des objets? J'ai eu des réponses génériques avec une grande attitude anti-noob et j'ai encore une bonne explication


excellent moyen de montrer des structures de mémoire. +1


@ Lord.Quackster Il n'y a pas de différence entre la façon dont Java gère des objets par opposition aux types primitifs. Les deux sont passés par la valeur. Cependant, depuis que Java fonctionne avec des "références" d'objets, il est possible de muter la référence transmise. Mais puisque la référence elle-même est transmise par la valeur, la référence ne peut pas être réinitialisée à autre chose.


@Thelq: J'aime dire que Java passe par copie-de-la valeur de la variable. En cas de primitives, la valeur elle-même est la valeur elle-même; Pour les objets, la valeur copiée est quelque chose qui indique à la JVM comment récupérer l'objet dans la mémoire du tas. Je n'aime pas utiliser des chaînes quand on en parle parce qu'ils sont immuables (toujours, une chaîne est un objet). Plus ici: Stackoverflow.com/questions/ 40480 / IST-Java-Pass-By-Référence / ...



2
votes

Java ne passe pas par référence, il passe la valeur de la référence. Lorsque vous attribuez s = "pas null" , vous réaffectant cette valeur.


0 commentaires

0
votes
s =
this is why. you are assigning to s, not modifying the object that s points to.

0 commentaires

1
votes

J'espérais faire quelque chose comme SetNotnull (MyObject O) sans utiliser O = SetNotNull (O)

Tout simplement, vous ne pouvez pas. Le plus proche que vous obtiendrez est quelque chose comme ceci: xxx

qui est tout plutôt maladroit et ne valait probablement pas l'effort.


0 commentaires