老师,为什么这里name不是浅拷贝?
来源:4-10 你的序列化实现的是深拷贝还是浅拷贝?
Vali_Lucifer3477978
2020-09-11
private static void copyTest() {
Worker worker1 = new Worker(
“qinyi”, 19, “m”, “University”, “2000”
);
System.out.println("The original is " + worker1.getEducationInfo().getSchool());
Worker worker2 = (Worker) worker1.clone();
System.out.println("The cloned is " + worker2.getEducationInfo().getSchool());
worker2.getEducationInfo().setSchool("College");
worker2.setName("xxxxx");
System.out.println("The original is " + worker1.getEducationInfo().getSchool());
System.out.println("The cloned is " + worker2.getEducationInfo().getSchool());
System.out.println("The original name is " + worker1.getName());
System.out.println("The cloned name is " + worker2.getName());
}
写回答
1回答
-
张勤一
2020-09-11
同学你好:
String 类型很特殊,它是不可变类型,即一旦初始化后,就不可以改变。因为它是引用类型,而且它指向的值为常量,克隆出来的对象改变它的值,实际上是改变了克隆出来对象 String 类型成员的指向,不会影响被克隆对象的。
更为书本化的解释是:如果原来对象的一个 String 变量进行初始化的时候,指向的是一个字符串常量,该字符串常量会被放到常量池中,该 String 类型的引用将会指向该常量。进行克隆后,得到一个新的对象,如果该对象的 String 变量重新赋值,那么只会有这个 String 引用变量指向一个新的内存区域,对原来对象中的 String 变量不会有影响。我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!
122020-09-12
相似问题