J'ai une classe,aide avec des variables statiques en Java
class MyClass {
private int val;
public static final MyClass myObject = new MyClass(1);
MyClass(int a){
val = a;
}
public int getVal(){
return val;
}
public MyClass func1(){
MyClass temp = myObject;
temp.val = 2;
return temp;
}
public static void main(String [] args){
MyClass x = new MyClass(4);
System.out.println(myObject.getVal());
x.func1();
System.out.println(myObject.getVal());
}
}
Il imprime:
1
2
je m'y attendais à imprimer:
1
1
Il semble y avoir un malentendu fondamental de ma part. Je m'attendais à ce que myObject
étant une valeur final static
ne peut pas être changé, et quand je fais MyClass temp = myObject
, je crée un nouvel objet appelé temp
de type MyClass
et affectez la valeur de myObject
à cet objet nouvellement créé. S'il vous plait corrigez moi si je me trompe. Il semble qu'il n'y a pas de nouvel objet créé et temp
pointe simplement vers l'original myObject
EDIT: Merci pour les réponses! Je comprends maintenant que l'opérateur =
ne fait jamais une copie de l'objet, il copie juste la référence. Ce dont j'ai besoin est de faire une copie de myObject
et de le stocker dans temp
. Quel serait le meilleur moyen d'y parvenir?
EDIT2: Un autre comportement étrange ou une caractéristique de Java?
I modifié le code légèrement
class MyClass {
private Integer val;
public static final MyClass myObject = new MyClass(1);
MyClass(int a){
val = a;
}
public int getVal(){
return val;
}
public MyClass func1(){
MyClass temp = new MyClass(33);
temp.val = myObject.val;
temp.val = 2;
return temp;
}
public static void main(String [] args){
MyClass x = new MyClass(4);
System.out.println(myObject.getVal());
MyClass y = x.func1();
System.out.println(x.getVal());
System.out.println(y.getVal());
System.out.println(myObject.getVal());
}
}
sortie est
1
4
2
1
Par conséquent, lorsque je crée temp
à l'aide new MyClass(33)
puis définissez temp.val = 2
, il est en fait une copie de val. En d'autres termes, temp.val
ne pointe pas vers myObject.val
. Pourquoi cela est-il ainsi?
Je pense que vous essayez d'appliquer Singleton Pattern http://en.wikipedia.org/wiki/Singleton_pattern#Java BTW, votre question est déjà répond en plusieurs réponses ci-dessous. –