老师,worker 的clone方法老师在main里面是用到了,那为什么还要在educationInfo里面定义clone呢,好像没有用啊

来源:4-10 你的序列化实现的是深拷贝还是浅拷贝?

Vali_Lucifer3477978

2020-09-11

写回答

1回答

张勤一

2020-09-11

同学你好:

    clone 就是复制 , 在 Java 语言中, clone 方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。

    clone 方法位于 Object 中,该方法用于创建并返回此对象的一个副本。Object 类是所有 Java 类的父类,因此所有的 Java 类都继承了 clone 方法,该方法的访问控制修饰符为 protected。

    需要注意的是,想要调用该方法,被复制的对象的类必须实现 java.lang.Cloneable 接口。如果没有实现Cloneable 接口的类的实例调用了 clone 方法,则会在运行时抛出 CloneNotSupportedException 异常。

    Cloneable 接口中没有声明任何方法,只是用来标记“可以使用 clone 方法进行复制”的,这样的接口也被称为标记接口(marker interface)。

    所以,是否需要定义 clone 方法或者说是否需要实现 Cloneable 接口,就是看你在代码中有没有使用到它。其实,我们的代码是使用的了,如下所示:

try {
    // 直接调用父类的 clone() 方法
    Worker worker = (Worker) super.clone();
    // EducationInfo 也需要实现 Cloneable 接口了
    worker.educationInfo = (EducationInfo) educationInfo.clone();
    return worker;
} catch (CloneNotSupportedException e) {
    return null;
}

    不需要去考虑某个类实现了什么,主要是看你是否调用了什么;如果调用了,则必须要实现,但是,反过来,即使没有调用,实现也不会有问题(不会对你的工程或者代码造成错误的)。


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

1
0

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

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

466 学习 · 204 问题

查看课程