「java克隆图解」java中的克隆方法

博主:adminadmin 2022-12-03 01:54:08 73

本篇文章给大家谈谈java克隆图解,以及java中的克隆方法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java中的浅克隆和深克隆是什么

克隆是指克隆对象,在堆空间复制一块内存,是完全的两个对象,不是指针指向!浅克隆是指克隆一个对象,而该对象的属性只是基本数据类型,只克隆出该对象!深度克隆是指克隆的目标里面还有引用类型,引用类型里还有引用类型,同时把引用类型克隆出来叫深度克隆!常用的方法有两种,第一,需克隆的对象实现cloneable接口;第二,使用commons包提供的克隆方法。这两种方法都能实现深度克隆!

关于java克隆对象

--在使用clone方法时,对于每一个类,都需要做如下判断:

1--默认的clone方法是否能满足要求

2--默认的clone方法是否能通过调用可变子对象的clone方法修补

3--是否不应该使用clone

----如选择1和2,就必须实现Cloneable接口,使用public重定义clone方法

意思就是,你如果想用clone方法,首先要考虑Object的clone能不能满足你的需求,如果可以,那好,直接调用,反之,你就得必须在需要使用clone方法的类中实现Cloneable接口,自己写一个Clone规则。

java中的克隆技术具体有什么应用?

Clone基本知识储备

在Java里提到clone技术,就不能不提java.lang.Cloneable接口和含有clone方法的Object类。所有具有clone功能的类都有一个特性,那就是它直接或间接地实现了Cloneable接口。否则,我们在尝试调用clone()方法时,将会触发CloneNotSupportedException异常。 下面我们通过对Object类的部分源码的分析,来发现和理解这一特性。

l clone的实现

1.实现Cloneable接口

通过上一篇的介绍,我们知道,一个类若要具备clone功能,就必须实现Cloneable接口。做到这一步,clone功能已经基本实现了。Clone功能对我们来说,最主要的还是要能够使用它。那么我们如何才能使用clone功能呢?答案是覆盖Object#clone()方法。

2. 覆盖Object#clone()方法

为什么需要覆盖Object#clone()方法?这里得再次从jdk源码说起。JDK中Object# clone()方法的原型是:

protected native Object clone() throws CloneNotSupportedException;

是否注意到,这里clone()方法修饰符是protected,而不是public。这种访问的不可见性使得我们对Object#clone()方法不可见。相信读者已明白为什么要覆盖Object#clone()方法。而且,覆盖的方法的修饰符必须是public,如果还保留为protected,覆盖将变得没有实际意义。下面举一个具有clone功能的简单的例子:

/*

* 具有clone功能的类的例子

*/

public class CloneableObjExample implements Cloneable {

//……部分代码已省略……

private String name = null;

private int score = 0;

/**

* NOTE: 将protected 修饰符 更改为 public

* @see java.lang.Object#clone()

*/

public/*protected*/ Object clone() throws CloneNotSupportedException {

// call父类的clone方法

Object result = super.clone();

//TODO: 定制clone数据

return result;

}

}

3.定制clone

至此,clone已经真相大白。Clone的对象我们可以对其进行定制。还就上面的例子来说。下面的方法对功能做了一定的增强:

public/*protected*/ Object clone() throws CloneNotSupportedException {

// call父类的clone方法

CloneableObjExample result = (CloneableObjExample)super.clone();

//TODO: 定制clone数据

//虽然”clone”了,但还可以做点调整

result.name = “New Name”;

result.score = 90;

return result;

}

本篇介绍了如何实现clone。接下来的篇幅将就纵深clone等clone的高级特性进行分析。

本章将进入clone的高级特性,着重讲述纵深clone技术。

Clone通常有两种类型即浅clone和深clone。首先,分析一下两种的不同。浅clone和深clone都是clone,它们本质区别是对象内部的成员属性(非原生类型属性,如int等)在clone时是否处理为引用。如果仍然保留为引用,则称为浅clone,反之称为深clone。其实这两个概念也是相对的概念。在处理上它们有点区别,浅clone方式得到clone对象即可,深clone方式在得到clone对象后,还需要对引用的成员属性进行“clone”处理。从这个层次上说,深clone并没有什么特别地困难,简单讲就是创建好对象,再设置一些成员属性。关于深clone,网上的文章已经有太多,有点目不暇接的感觉,本文不再赘述,这也不是本文的重点。

本文的重点是要阐述纵深clone,亦即“N深clone”。深到什么程度为止?本文描述的目标是一直深到你想要的程度,包括深到不能再深的程度。

java中怎么克隆对象流

先将要克隆的对象序列化,也就是实现java.io.Serializable接口,然后再复制。你这个问题也就是类型转换的问题,要看具体情况了,呵呵,不好意思,希望不会添乱

java如何实现对象的克隆

可以重载clone方法克隆对象

首先、该类要实现Cloneable的接口,不然执行clone方法的时候会抛出CloneNotSupportedException异常

然后、就在该类重载clone方法,自己加上克隆的逻辑,本人小白,手敲的代码

public class Book implement Cloneable{

    private String name;

    

    public Book(String name){

        this.name=name;

    }

    

    @Override

public Book clone() throws CloneNotSupportedException {

return new Book(this.name);

}

}

java中深克隆与浅克隆的区别

能够给你做出解释,我很荣幸!!献丑了:

A、你说的很对,无论是深克隆还是浅克隆都是克隆,既然是克隆就必然会产生一个全新的对象,这个全新的对象和原对象的保持一致性的深浅取决于克隆的深度。但需要始终明确的一点是克隆的对象与源对象没有任何关系,它在堆中是一个独立的实体,占据独立的内存地址,与原对象没有任何引用与指向关系。这个新生的对象是在源对象被克隆时由JVM运行时环境在调用类加载器时通过反射创建出来的。

B、深克隆与浅克隆的区别:深克隆的过程是通过序列化来完成的,而序列化的过程可以将对象及所牵涉的所有引用链中的对象一起通过字节流的方式转移到特定的存储单元中(这个存储单元可以是内存也可以是硬盘,对于克隆通常是序列化至内存),再通过反序列化的过程读出这些序列化的字节流重构出对象,这样就完成了一个新对象的产生。而浅克隆不用序列化,这种克隆方式仅仅只是将指定的当前对象复制出来一个,这种复制过程不包括原对象引用的各个对象

C、克隆出的对象与原对象具有相同的属性及方法,但克隆的对象与原对象是属于两个不同的独立对象,因此二者占据内存中不同的空间地址。这就好比两个人长的极为相像但他们毕竟还是属于两个人,可以住在不同的场所。

java克隆图解的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java中的克隆方法、java克隆图解的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-03,除非注明,否则均为首码项目网原创文章,转载请注明出处。