老师,为什么这里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!共同建造、维护这门课程,我需要每一个你!

1
2
Vali_Lucifer3477978
” 行克隆后,得到一个新的对象,如果该对象的 String 变量重新赋值,那么只会有这个 String 引用变量指向一个新的内存区域,对原来对象中的 String 变量不会有影响。“ 拥有这种特性的,除了string以外,还有什么吗?
2020-09-12
共2条回复

Java实操避坑指南 SpringBoot/MySQL/Redis错误详解

掌握业务开发中各种类型的坑,,Java web开发领域通用

466 学习 · 204 问题

查看课程