前提:在Java语言中所有的类的都是缺省的继承Java语言中的Object类的,

protected native Object clone() throws CloneNotSupportedException;

它还是一个native的方法,大家都知道native的方法是非Java语言实现的代码,供Java语言调用,因为Java程序是运行在虚拟机上的,要想访问到比较低层的与操作系统相关的就没有办法了,只能由靠近操作系统的语言实现。

每一个对象直接或者间接的继承Object,因此他们都含有clone()方法,但是这个方法是Protected,所以不能在类外边访问。要想实现对一个对象的复制,就需要对clone()方法进行覆盖。

为什么要克隆?

克隆的对象可能包含一些已经修改过的属性,而new出来的对象都是初始化时候的值,所以当需要一个新的对象保存当前对象状态的时候就要靠clone()方法了。那么如果把这个对象的临时属性一个一个的赋值给新new出来的变量就会比较麻烦;而且clone()方法是非Java语言实现的更接近低层,所以速度比较快。

注意:我们常见的Object a=new Object();Object b;b=a;这种形式的代码复制的是引用,即对象在内存中的地址,a和b对象仍然指向了同一个对象。通过clone()方法复制的对象跟原来的对象是同时独立存在的。

如何实现克隆?

两种不同的克隆方法:浅克隆(shallowclone)和深克隆(deepclone) 。在Java语言中,数据类型分为基本数据类型和引用类型,其中引用数据类型主要包括类、接口、数组等复杂的数据类型。浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制。

一、浅克隆的一般步骤:

  • 被复制的类需要实现Clonable接口。该接口为标记接口,里边不含任何的方法。
  • 覆盖clone()方法,访问修饰符设为public,方法中调用super.clone()方法得到需要的复制对象。

  这就是浅克隆,两个对象引用分别指向的是不同的堆内存空间。这里我们能看到,在学生这个类里面的所有成员变量都是基本数据类型,所以这个时候使用浅克隆是完全没有问题的,因为成员变量不涉及到引用数据类型。

二、深克隆的一般步骤:

深克隆和浅克隆的区别就是在一个类里边如果有引用类型的变量的话,依然使用浅克隆的方法进行对象引用的复制,那么出现的结果就是对象里的引用类型变量只是变量的复制,实际上并没有为复制的引用类型变量重新开辟空间。所以,为了达到真正的复制对象,针对引用类型变量不单单是变量的复制,我们需要将引用类型变量可复制化,并且还要修改clone()方法。

Eg:在学生类里边加入地址类:

深克隆的一般步骤:

  • 当某一个类A是另一个类B的成员变量的时候,那么类A也要实现Clonable()这个接口,并且重写clone()方法。

  • 类B也要实现Clonable()这个接口,并且在类B的实现代码里边也要重写clone()方法。

浅克隆和深克隆的比较?

1、浅克隆:在前克隆中,如果原型对象的成员变量是值的类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量(引用类型)指向相同的内存地址。

2、深克隆:在深克隆中无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。

简单地说就是在深克隆中,除了对象本身被复制外,对象所包含的成员变量也将复制。

注意:如果引用类型里面还包含很多引用类型,或者内层引用类型的类里面又包含引用类型,使用clone方法就会很麻烦。这时我们可以用序列化的方式来实现对象的深克隆。

java基础知识总结--对象的克隆的更多相关文章

  1. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  2. java基础知识小总结【转】

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  3. 学习android学习必备的java基础知识--四大内部类

    学习android必备的java基础知识--四大内部类 今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就 ...

  4. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  5. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  6. Java 基础知识(一)

    Java基础知识篇: 一.关键字解释 1. final:修饰非抽象类,非抽象方法和属性, 以及修饰方法参数,代表“无法改变的”.出于对设计或者效率的考虑使用该关键字. final类无法被继承,fina ...

  7. Java 基础知识总结

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.数据类型:  数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte  8位   (by ...

  8. 学习Spring必学的Java基础知识(1)----反射(转)

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  9. 学习Spring必学的Java基础知识(1)----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

随机推荐

  1. python---实现多个有序列表的合并

    我觉得不用抄书上的代码. 遇到实现问题,应该结合python本身的功能去解决. 比如,当合并有序列表时,为什么一定要一项一项比较,而不是使用list的sort函数呢? # coding = utf-8 ...

  2. CND网站加速

    CDN是什么 1-CDN俗称网站加速2-公司一般是购买其他cdn服务商提供的服务3-CDN一般是用来缓存网站的静态资源文件的(css,js,图片,html,htm),浏览器获取某个静态资源是按照就近原 ...

  3. yum安装mongodb

    1.创建mongodb.repo文件 在/etc/yum.repos.d/目录下创建文件mongodb.repo,它包含MongoDB仓库的配置信息,内容如下: 复制代码代码如下: [mongodb] ...

  4. du -h排序

    du -sh * du -s /tmp/*|sort -nr|head -3

  5. Flink的容错

    checkpoint介绍 checkpoint机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保 ...

  6. 基于Kubernetes集群部署skyDNS服务

    目录贴:Kubernetes学习系列 在之前几篇文章的基础,(Centos7部署Kubernetes集群.基于kubernetes集群部署DashBoard.为Kubernetes集群部署本地镜像仓库 ...

  7. JavaEE 之 Spring(一)

    1.Spring a.作用:降低组件与组件之间的关联,便于系统的维护和拓展 b.核心思想: ①IOC:控制反转——配置文件依赖注入 ②AOP:面向切面编程 2.IOC/DI a.建配置文件 <? ...

  8. Qt Creator插件Todo

     转载:http://techieliang.com/2017/12/502/   文章目录 1. 插件启动 2. 插件效果 3. 插件配置 4. 使用 码代码的过程往往并不是一气呵成,有时候需要记录 ...

  9. Python库: PrettyTable 模块

    一,PrettyTable简介 PrettyTable是python中的一个第三方库,可用来生成美观的ASCII格式的表格: 二,PrettyTable安装 使用PIP即可十分方便的安装PrettyT ...

  10. 004.etcd集群部署-动态发现

    一 etcd发现简介 1.1 需求背景 在实际环境中,集群成员的ip可能不会提前知道.如使用dhcp自动获取的情况,在这些情况下,使用自动发现来引导etcdetcd集群,而不是指定静态配置,这个过程被 ...