8
votes

Affectation en Java?

dis que je définis int A = int B. Lorsque je change A après, il ne changera pas la valeur de B. Mais lorsque je fixe une soméclasse A = Someclass B, et je change de contenu d'un SOMECLASS B, et je change de contenu (comme A.Cost), Cela change B.Cost aussi. Quelqu'un peut-il m'expliquer cela?

Je pensais que Java est attribué par valeur, pas référence?


0 commentaires

5 Réponses :


26
votes

Oui, c'est - mais la valeur d'A est une référence, pas une copie de l'objet lui-même.

J'aime donner l'analogie suivante ... P>

Supposons que deux personnes ont Mon adresse: c'est comme deux variables de type maison code> en Java. Maintenant, l'un d'entre eux vient et peint ma porte rouge. La deuxième personne verra toujours la porte rouge s'ils visitent: P>

House jonsHouse = new House(); // Even the variable jonsHouse is only a reference

House firstAddressCopy = jonsHouse; // Just a copy of the reference
House secondAddressCopy = jonsHouse; // Just a copy of the reference

firstAddressCopy.paintDoor(Color.Red);

Color color = secondAddressCopy.getDoorColor(); // Now color will be red
  • La valeur d'une expression en Java est jamais em> un objet - une seule référence ou une valeur primitive li>
  • (corollaire du premier point) Une variable jamais em> détient un objet - une seule référence ou une valeur primitive li>
  • assignation (et argument qui passe) toujours em> copie la valeur, que cette valeur soit une référence ou une valeur primitive li> ul> p>


0 commentaires

2
votes

Je pensais que Java est attribué par valeur, pas référence?

Que signifie "attribué par valeur"? Êtes-vous peut-être le confondre avec "Pass par valeur / référence"?

En tout cas, si vous gérez une instance de classe en Java, vous gérez réellement une référence à cette classe (un peu comme un pointeur en C / C ++). Votre affectation ne copie que la référence, donc A et B se réfèrent à la même instance, c'est-à-dire que les données sont partagées, d'où le résultat.


0 commentaires

1
votes

a est une référence à l'objet. Donc, si vous modifiez l'objet état interne , il sera reflété à toutes les autres variables pointant vers elle.

Si vous réaffectez a , puis b ne changera pas: xxx

(Java est pass par valeur. Vérifiez cet article à ce sujet.)


2 commentaires

Java passe strictement par valeur. Lorsque vous passez une référence par valeur uniquement, la référence est dupliquée, et non l'objet étant référencé.


@Maven, bien sûr, une erreur stupide, j'y pensais une et écrivit l'autre :) merci



0
votes

En Java, vos variables peuvent être divisées en deux catégories: objets, et tout le reste (int, long, octet, etc.).

Un type primitif (int, long, etc.), contient la valeur que vous attribuez. Une variable d'objet, en revanche, contient une référence à un objet quelque part. Donc, si vous attribuez une variable d'objet à un autre, vous avez copié la référence, à la fois A et B pointe vers le même objet.

REMARQUE: Les chaînes en Java sont en réalité des objets, pas des primitives, que les débutants supposent souvent.

J'espère que cela aide


0 commentaires

0
votes

en Java lorsque vous attribuez un objet à l'objet de son assignation par référence. INT n'est pas un objet en Java, donc lorsque vous attribuez à INT à l'ARD ART ART.


0 commentaires