java中静态变量的帮助
我有课java中静态变量的帮助,java,static,constructor,new-operator,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 = myObj
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
是一个最终静态值
不能更改,当我这样做MyClass temp=myObject
时,我创建了一个类型为MyClass
的名为temp
的新对象,并将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
因此,当我使用
newmyclass(33)
创建temp
并设置temp.val=2
时,它实际上是val的副本。换句话说,temp.val
并不指向myObject.val
。为什么会这样?该字段是最终的
,这意味着您无法重新分配该字段。然而,您的myObject
var并不是不可变的。在myObject
上调用func1()
时,将myObject.val
更改为2
MyClass temp = myObject;
这并不是创建一个新的实例,它只是分配引用,以便temp指向与myObject相同的实例
因此,你的声明:
我创建了一个名为temp of的新对象
类型MyClass
不正确,因为您不是在这里创建新对象,只是指定了一个对象引用
编辑
如果您的目标是复制myObject并从func1()
返回它,那么您可以这样做(通过复制,我假设您的意思是也复制val
值,如果您想为val
使用不同的值,那么您可以相应地调整此代码):
我想你已经回答了你自己的问题。你说的没错,实际上没有一个新对象是由行
MyClass temp=myObject创建的代码>临时只是myClass静态实例的对象引用
您可以通过修改代码来检查这一点
public MyClass func1(){
MyClass temp = myObject;
System.out.println(myObject == temp);//print true
temp.val = 2;
return temp;
}
您正在获取对MyClass对象实例的引用并修改其一个成员。这种参照不是一成不变的;只有名为MyObjr的字段是不可变的。< /P> < P>在爪哇中,<代码> = /COD>操作符分配引用,而不是C++中的对象。
最后一个字段只能指定一次。这并不意味着不能修改通过最终字段可访问的对象
换句话说:与C++的const
不同,final
只保护引用,而不是对象。阅读发布的答案后:
如果希望temp引用变量保存对不可变对象的引用,可以使类不可变
您可以在此处找到有关如何执行此操作的更多信息:
或
修改器final的定义声明对象引用不能更改。
在第一个代码段中
public static final MyClass myObject = new MyClass(1);
myObject是指向val=1的对象的最终引用。
但是,这并不意味着对象的内容不能更改。
函数func1()获取对值为1的对象的引用,并将其val更改为2。
因此,它是完全合法的
对于第二个片段
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); //line A
System.out.println(myObject.getVal()); //returns 1
MyClass y = x.func1(); //line B
System.out.println(x.getVal()); //line C
System.out.println(y.getVal()); //line D
System.out.println(myObject.getVal());
}
在第行,创建了val为4的obj。
在B行调用func1,该行创建了一个val=33的新对象,然后将其更改为val=1,然后再更改为val=2。
在C行,我们从A行创建的obj中获得输出4。
在D行,我们从使用B行所做的更改中得到输出2。
在C++中,我们从静态的最终对象中得到1的输出,它没有被改变。
我认为你正在尝试实现单模式模式BTW,你的问题已经在下面的多个答案中得到答案。这取决于你在C++(或C)中把<代码> const <代码>放在哪里。
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); //line A
System.out.println(myObject.getVal()); //returns 1
MyClass y = x.func1(); //line B
System.out.println(x.getVal()); //line C
System.out.println(y.getVal()); //line D
System.out.println(myObject.getVal());
}