Jus*_*s12 3 java static constructor new-operator
我有一节课,
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());
}
}
Run Code Online (Sandbox Code Playgroud)
它打印:
1
2
Run Code Online (Sandbox Code Playgroud)
我期待它打印:
1
1
Run Code Online (Sandbox Code Playgroud)
对我来说似乎存在根本的误解.我期待这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());
}
}
Run Code Online (Sandbox Code Playgroud)
输出是
1
4
2
1
Run Code Online (Sandbox Code Playgroud)
因此,当我创建temp使用new MyClass(33)然后设置时temp.val = 2,它实际上是一个val的副本.换句话说,temp.val不指向myObject.val.为什么会这样?
MyClass temp = myObject;
Run Code Online (Sandbox Code Playgroud)
那不是创建一个新实例,它只是分配引用,以便temp指向与myObject相同的实例.
所以你的声明:
我创建了一个名为temp of MyClass的新对象
是不正确的,因为您不在此处创建新对象,只需指定对象引用.
编辑
如果您的目标是复制myObject并将其从中返回func1(),那么您可以这样做(通过复制我假设您的意思是复制该val值,如果您想使用不同的值,val那么您可以相应地调整此代码):
public MyClass func1(){
MyClass temp = new MyClass(myObject.getVal());
return temp;
}
Run Code Online (Sandbox Code Playgroud)
该字段是final,这意味着您无法重新分配该字段.myObject但是,你的var不是不可变的.当你打电话func1()给你时myObject,你将myObject.val改为2.
| 归档时间: |
|
| 查看次数: |
1567 次 |
| 最近记录: |