请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,为什么这里name不是浅拷贝?

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());


}

正在回答 回答被采纳积分+3

1回答

张勤一 2020-09-11 15:15:15

同学你好:

    String 类型很特殊,它是不可变类型,即一旦初始化后,就不可以改变。因为它是引用类型,而且它指向的值为常量,克隆出来的对象改变它的值,实际上是改变了克隆出来对象 String 类型成员的指向,不会影响被克隆对象的。
    更为书本化的解释是:如果原来对象的一个 String 变量进行初始化的时候,指向的是一个字符串常量,该字符串常量会被放到常量池中,该 String 类型的引用将会指向该常量。进行克隆后,得到一个新的对象,如果该对象的 String 变量重新赋值,那么只会有这个 String 引用变量指向一个新的内存区域,对原来对象中的 String 变量不会有影响。

    我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!

1 回复 有任何疑惑可以回复我~
  • 提问者 Vali_Lucifer3477978 #1
    System.out.println("The original age is " + worker1.getAge()); System.out.println("The cloned age is " + worker2.getAge());
    
    除去String, integer好像也是不可变类型,不可变类型有几种啊
    回复 有任何疑惑可以回复我~ 2020-09-12 12:57:07
  • 提问者 Vali_Lucifer3477978 #2
    ” 行克隆后,得到一个新的对象,如果该对象的 String 变量重新赋值,那么只会有这个 String 引用变量指向一个新的内存区域,对原来对象中的 String 变量不会有影响。“ 拥有这种特性的,除了string以外,还有什么吗?
    回复 有任何疑惑可以回复我~ 2020-09-12 13:00:44
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信