帮助java中的静态变量

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.为什么会这样?

dcp*_*dcp 7

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)


akf*_*akf 5

该字段是final,这意味着您无法重新分配该字段.myObject但是,你的var不是不可变的.当你打电话func1()给你时myObject,你将myObject.val改为2.