У меня есть класс,
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());
}
}
Он печатает:
1
2
Я ожидал, что он напечатает:
1
1
Кажется, с моей стороны есть фундаментальное недоразумение. Я ожидал, что myObject
как значение final static
не может быть изменено, и когда я делаю MyClass temp = myObject
, я создаю новый объект с именем temp
типа MyClass
и присваиваю значение myObject
этому новому созданный объект. Пожалуйста, поправьте меня, если я ошибаюсь. Похоже, что новый объект не создан и temp
просто указывает на исходный myObject
РЕДАКТИРОВАТЬ: Спасибо за ответы! Теперь я понимаю, что оператор =
никогда не делает копию объекта, он просто копирует ссылку. Мне нужно сделать копию myObject
и сохранить ее в temp
. Каков наилучший способ добиться этого?
EDIT2: еще один странный поведение или особенность Java?
Я немного изменил код
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());
}
}
вывод
1
4
2
1
Поэтому, когда я создаю temp
с использованием new MyClass(33)
и затем устанавливаю temp.val = 2
, он фактически создает копию val. Другими словами, temp.val
не указывает на myObject.val
. Почему это так?