1.背景

用java写程序的时候很苦恼的一件事就是,如果将一个对象a赋给另一个对象b,那么你改变a的变量值得时候,b的值也对应的变化。如果我们只想单纯的获取那个时刻的a的状况给b的话,就要用到clone方法了。

比如说如下代码:

public class Main {public static void main(String[] args) {// TODO Auto-generated method stubNode n=new Node();Node n1=n;n.a=5;System.out.print(""+n1.a);}}
public class Node {int a=1;}

输出结果是5,

下面就利用clone实现如上情况输出结果是1.

2.代码

克隆的实现需要一下几步:

在派生类中覆盖基类的clone()方法,并声明为public。

在派生类的clone()方法中,调用super.clone()。

在派生类中实现Cloneable接口。Cloneable接口没有任何抽象的方法,这样的成为标识接口。实现这个接口,只是为了告诉编译器这个对象可以被克隆了。

首先我们在派生类中覆盖了Object类的Clone()方法,并声明为public的。然后我们调用了super.clone()方法,这里会抛出一个异常(对于这个异常大家可以自己查看java的帮助文档),所以必须用try……catch……语句捕获,然后返回此对象。这里需要说明一下,Clone()方法返回的是Object类型的,所以需要强制类型转换

public class Main {public static void main(String[] args) {// TODO Auto-generated method stubNode n=new Node();Node n1=(Node)n.clone();n.a=5;System.out.print(""+n1.a);}}
public class Node implements Cloneable{int a=1;public Object clone(){Node n=null;try{n=(Node)super.clone();}catch(Exception e ){e.printStackTrace();}return n;}
}

输出结果是1;

ps:补充一道题

15. 不通过构造函数也能创建对象吗()

A 是     B 否

答案:A

解析:Java创建对象的几种方式(重要):

(1) 用new语句创建对象,这是最常见的创建对象的方法。
(2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
(3) 调用对象的clone()方法。
(4) 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。

(1)和(2)都会明确的显式的调用构造函数 ;(3)是在内存上对已有对象的影印,所以不会调用构造函数 ;(4)是从文件中还原类的对象,也不会调用构造函数。

引用:【1】http://blog.csdn.net/mengxiangyue/article/details/6818611
           【2】http://blog.csdn.net/lanxuezaipiao/article/details/16753743

/********************************

* 本文来自博客  “李博Garvin“

* 转载请标明出处:http://blog.csdn.net/buptgshengod

******************************************/

Java的clone()用法实例解析相关推荐

  1. java -ArrayList的用法实例--学生宿舍管理系统

    java -ArrayList的用法实例--学生宿舍管理系统 对于利用ArrayLis来实现增,删,改,查希望对大家有用! import java.util.*; import java.io.*; ...

  2. python画猴子_Python猴子补丁Monkey Patch用法实例解析

    属性在运行时的动态替换,叫做猴子补丁(Monkey Patch). 为什么叫猴子补丁 属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上查到两种说法: 1.这个词原来为Guerrilla Pa ...

  3. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

  4. java hasnext_java hasNext()使用实例解析

    这篇文章主要介绍了java hasNext()使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 编写一段程序实现如果输入的一组数中含非整数 ...

  5. java斗地主代码_实例解析java如何实现斗地主代码

    实例解析java如何实现斗地主代码 发布时间:2020-07-20 14:41:41 来源:亿速云 阅读:73 作者:小猪 小编这次要给大家分享的是实例解析java如何实现斗地主代码,文章内容丰富,感 ...

  6. 什么是java内省_Java内省实例解析

    图像中轮廓的个数,里面vector的size代表了轮廓上点的个数.了解JavaBean 内省对应的英文单词为IntroSpector,它主要用于对JavaBean进行操作,JavaBean是一种特殊的 ...

  7. Nodejs 文件 与 路径 相关用法实例解析

    Nodejs 文件 与 路径 相关用法 CSDN用户名:jcLee95 邮箱:291148484@163.com 原创不易,感谢点赞支持. 1.路径 (1)引入path模块 const path = ...

  8. Python单元测试及unittest框架用法实例解析

    例题取用登录模块:代码如下 def login_check(username,password):''' 登录校验的函数:param username:账号:param password: 密码:re ...

  9. python中enumerate在for循环中用法_python中enumerate的用法实例解析

    在python中enumerate的用法多用于在for循环中得到计数,本文即以实例形式向大家展现python中enumerate的用法.具体如下: enumerate参数为可遍历的变量,如 字符串,列 ...

最新文章

  1. CVPR 2021| 端到端场景无关视觉定位算法(SuperGlue一作出品)
  2. Asp.net实现在线截图(大图截取为小图)
  3. ubutu14.04无法使用sudo,也无法切换到root用户去解决问题怎么办?
  4. Goland 这些实操技巧,你可能还不会!
  5. React开发(114):不建议用setstate回调
  6. 【Brain】脑智前沿科普|用数学解释大脑学习的过程
  7. loadRunner函数之lr_set_debug_message
  8. reg、wire与logic的区别
  9. Datawhale组队学习周报(第025周)
  10. 第七周 项目四-队列数组
  11. TrafficStats 网络实时测速
  12. Python 第三方模块 统计2 patsy,chowtest
  13. jmeter压测生成报告
  14. 征信报告产生“不良记录”的主要原因?
  15. springboot实现简单的注册登录功能
  16. 三西格玛和六西格玛区别是什么?优思学院用一幅图告诉你
  17. Linux延时摄影软件,利用树莓派和官方摄像头实现延时摄影
  18. 24bit真彩色 32bit真彩色
  19. matlab中软开关,数字化软开关电源的Matlab仿真研究
  20. 页面禁止用户输入中文实现方式

热门文章

  1. 《图解HTTP》读书笔记--第5章与HTTP协作的Web服务器
  2. 未发现数据源名称并且未指定默认驱动程序_10个有用的HTML5功能,您可能未使用
  3. petalinux zynq spi_ZYNQ 系列 01 | PL 实现按键控制 LED(1)
  4. python packages limited ram_python import自己创建的框架下的子模块—pychram和cmd正确执行脚本的两种方法...
  5. 如何把两个域控同步_同步带噪音大,怎么办?
  6. STM32外设之GPIO的推挽输出和开漏输出模式详解
  7. STM32分类及命名方法
  8. 关中断解决任务间资源共享问题
  9. pyqt5能否用于鸿蒙系统,PyQt显示来自opencv的视频流
  10. 利用计算机漏洞犯罪,利用漏洞非法谋利2000元怎么处罚