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!"; }
4 Réponses :
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 Initialement, vous avez ceci: p> Lorsque vous entrez d'abord la méthode setNotnull, vous obtenez une copie de la valeur em> de nulltest dans puis réaffectation s: p> puis laissez le Méthode: P> s code> pointe vers une nouvelle chaîne. Il pourrait être plus facile de comprendre avec un petit art ASCII.
s code>. Dans ce cas, la valeur de NullTest est une référence null: p>
------------
| nullTest |
------------
|
null
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 / ...
Java ne passe pas par référence, il passe la valeur de la référence. Lorsque vous attribuez s = "pas null" code>, vous réaffectant cette valeur. P>
s = this is why. you are assigning to s, not modifying the object that s points to.
J'espérais faire quelque chose comme SetNotnull (MyObject O) sans utiliser O = SetNotNull (O) P>
Tout simplement, vous ne pouvez pas. Le plus proche que vous obtiendrez est quelque chose comme ceci: p>
xxx pré> qui est tout plutôt maladroit et ne valait probablement pas l'effort. P> blockquote>
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.