J'ai appris que lorsque vous modifiez une variable en Java, cela ne change pas la variable sur laquelle elle était basée
int a = new Integer(5);
int b = a;
b = b + b;
System.out.println(a); // 5 comme prévu
System.out.println(b); // 10 comme prévu
J'ai supposé une chose similaire pour les objets. Considérez cette classe.
public class SomeObject {
public String text;
public SomeObject(String text) {
this.setText(text);
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
Après avoir essayé ce code, je suis devenu confus.
SomeObject s1 = new SomeObject("first");
SomeObject s2 = s1;
s2.setText("second");
System.out.println(s1.getText()); // second comme INattendu
System.out.println(s2.getText()); // second comme prévu
Veuillez m'expliquer pourquoi le changement de l'un des objets affecte l'autre. Je comprends que la valeur de la variable texte est stockée au même endroit dans la mémoire pour les deux objets.
Pourquoi les valeurs des variables sont-elles indépendantes mais corrélées pour les objets?
Aussi, comment dupliquer SomeObject, si une simple affectation ne fait pas le travail?
24 votes
Bienvenue dans les types de référence en Java, docstore.mik.ua/orelly/java-ent/jnut/ch02_10.htm.
5 votes
Bienvenue sur stackoverflow. ce sont les bases de java.. vous devriez d'abord étudier le concept de java.. utilisez ce tutoriel..
2 votes
Je pense que l'exemple est confus, même si la solution choisie est correcte :
Integer
est unObject
et non un type primitif. Si vous écrivezInteger b = a;
,b
fait référence à la même instance quea
. Mais en écrivantb = b+b;
,b
fait référence à une nouvelle instance créée par l'opérateur+
.0 votes
C'est hors sujet mais ne pas appeler une méthode surchargeable dans votre constructeur stackoverflow.com/questions/3404301/….
0 votes
De plus, vous voudrez peut-être déclarer que l'attribut texte de type String est privé, étant donné que vous fournissez des méthodes getter et setter pour travailler avec celui-ci, afin de masquer les détails de l'implémentation et de fournir une classe avec une meilleure abstraction (en général, une meilleure pratique orientée objet)