ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

帮助java中的静态变量

2019-07-13 02:12:38  阅读:152  来源: 互联网

标签:java constructor static 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());
    }
}

它打印:

 1
 2

我期待它打印:

 1 
 1

对我来说似乎存在根本的误解.我期望无法更改myObject是最终的静态值,当我执行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

因此,当我使用新的MyClass(33)创建temp然后设置temp.val = 2时,它实际上会生成val的副本.换句话说,temp.val不指向myObject.val.为什么会这样?

解决方法:

MyClass temp = myObject;

这不是创建一个新实例,它只是分配引用,以便temp指向与myObject相同的实例.

所以你的声明:

I create a new object called temp of
type MyClass

是不正确的,因为您不是在这里创建新对象,只是分配对象引用.

编辑
如果你的目标是制作myObject的副本并从func1()返回它,那么你可以这样做(通过复制我假设你的意思是复制val值,如果你想为val使用不同的值,那么你可以相应地调整此代码):

public MyClass func1(){
    MyClass temp = new MyClass(myObject.getVal());
    return temp;
}

标签:java,constructor,static,new-operator
来源: https://codeday.me/bug/20190713/1445153.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有