java-枚举类型引用或基元(带有示例)-浅/深复制
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-枚举类型引用或基元(带有示例)-浅/深复制,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2209字,纯文字阅读大概需要4分钟。
内容图文
![java-枚举类型引用或基元(带有示例)-浅/深复制](/upload/InfoBanner/zyjiaocheng/677/fd04b256607445d4af2899cc1087faf5.jpg)
我的问题很基本,但是我想100%理解所有内容. SO中的许多问题都与我的帖子有关,但我找不到令人满意的答案.
我们知道Java中的Enums是引用类型.让我们考虑以下代码段:
public static class A {
public int i;
public A(int i) {
this.i = i;
}
}
public static class Test {
int i;
A a;
public Test(int i, A a){
this.i = i;
this.a = a;
}
public Test(Test oldTest){
this.i = oldTest.i;
this.a = oldTest.a;
}
}
public static void main(String[] args) {
Test t1 = new Test(10, new A(100));
System.out.println(t1.i + " " + t1.a.i);
Test t2 = new Test(t1);
t2.i = 200;
t2.a.i = 3983;
System.out.println(t2.i + " " + t2.a.i);
System.out.println(t1.i + " " + t1.a.i);
}
输出非常明显,因为Test的副本构造函数进行了浅表复制:
10 100
200 3983
10 3983
但是,因为Java中的枚举也是引用类型,我不了解一件事.让我们用Enum代替A类:
public static enum TestEnum {
ONE, TWO, THREE;
}
public static class Test {
int i;
TestEnum enumValue;
public Test(int i, TestEnum enumVar){
this.i = i;
this.enumValue = enumVar;
}
public Test(Test oldTest){
this.i = oldTest.i;
this.enumValue = oldTest.enumValue; // WHY IT IS OK ??
}
}
public static void main(String[] args) {
Test t1 = new Test(10, TestEnum.ONE);
System.out.println(t1.i + " " + t1.enumValue);
Test t2 = new Test(t1);
t2.i = 200;
t2.enumValue = TestEnum.THREE; // why t1.emunValue != t2.enumValue ??
System.out.println(t2.i + " " + t2.enumValue);
System.out.println(t1.i + " " + t1.enumValue);
}
我期望输出:
10 ONE
200 THREE
10 THREE <--- I thought that reference has been copied... not value
但是我有:
10 ONE
200 THREE
10 ONE
问题:为什么?我的想法哪里不对?
解决方法:
这里的枚举没有什么特别的.如果使用字符串或任何类型,基本上您将看到完全相同的行为.
您的两个测试对象是完全分开的.当你写:
t2.enumValue = TestEnum.THREE;
您将第二个对象中的enumValue字段的值更改为对TestEnum.THREE引用的对象的引用.
两个enumValue字段(一个通过t1和一个通过t2)完全分开.更改一个字段不会更改另一个字段.
现在,如果改为使您的枚举可变(我强烈劝阻),并将您的代码更改为如下所示:
t2.enumValue.someMutableField = "a different value";
…这将通过t1.enumValue可见,因为它们都引用相同的对象.
在更改Test实例中的字段和更改通过Test实例碰巧到达的对象中的字段之间进行区分非常重要.
同样,这实际上与枚举无关.您可能会发现,通过将enumValue字段更改为String字段并进行这种尝试,可以更轻松地解决这个问题.
内容总结
以上是互联网集市为您收集整理的java-枚举类型引用或基元(带有示例)-浅/深复制全部内容,希望文章能够帮你解决java-枚举类型引用或基元(带有示例)-浅/深复制所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。