JAVA 对象的clone方法实例类型

Posted 断腿三郎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA 对象的clone方法实例类型相关的知识,希望对你有一定的参考价值。

1.Cloneable接口

这个接口一个方法都没有,但是要使用clone方法,就必须实现这个接口,否则抛出CloneNotSupportedException异常

2.clone方法的返回值

先附上两个类代码

package pojo;

/**
 * @Author : ZGQ
 * @Date : 2020/3/11 22:12
 * @Version : 1.0
 */
public class Person implements Cloneable{
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        System.out.println(super.clone().getClass());
        Person p = (Person) super.clone();
        p.name=this.name;
        p.age=this.age;
        return p;
    }
}
package pojo;

/**
 * @Author : ZGQ
 * @Date : 2020/3/11 22:21
 * @Version : 1.0
 */
public class Girl extends Person  {
    char cup;

    public Girl(String name, int age, char cup) {
        super(name, age);
        this.cup = cup;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        System.out.println(super.clone().getClass());
        Girl girl = (Girl) super.clone();

        girl.cup=this.cup;
        return girl;
    }

    @Override
    public String toString() {
        return "Girl{" +
                "cup=" + cup +
                ", name=\'" + name + \'\\\'\' +
                ", age=" + age +
                \'}\';
    }
}

我一开始很困惑,为什么clone方法可以将父类的实例交给子类的引用,输出一看才知道,在第一次clone时,创建的就是子类的对象
再创建一个boys类,或者直接调用Person.clone也一样,谁调用clone方法,就创建谁的实例

调用girl.clone():

调用person.clone():

调用boy.clone():

3.如果一个类没有实现Cloneable接口,那它就不可以被clone,它的子类也就不可能实现真正的深复制
多嘴一句,为什么不把clone方法定义在Cloneable中呢?

4.以上写法就是深复制的写法

5.为什么调用clone出来的是子类的实例呢?
可以显而易见的是确实这样比较合乎情理,但是java语言向我们隐瞒了实现细节,又是一个开后门的语法,像包装类可以使用运算符直接运算一样无耻

以上是关于JAVA 对象的clone方法实例类型的主要内容,如果未能解决你的问题,请参考以下文章

c# Clone方法

Clone的理解

Java - clone 方法属于浅拷贝 OR 深拷贝?

Java - clone 方法属于浅拷贝 OR 深拷贝?

java接口

java对象的内存布局