Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中静态变量的帮助_Java_Static_Constructor_New Operator - Fatal编程技术网

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());
}