Java的clone()用法实例解析
用java写程序的时候很苦恼的一件事就是,如果将一个对象a赋给另一个对象b,那么你改变a的变量值得时候,b的值也对应的变化。如果我们只想单纯的获取那个时刻的a的状况给b的话,就要用到clone方法了。
比如说如下代码:
public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Node n=new Node(); Node n1=n; n.a=5; System.out.print(""+n1.a); public class Node { int a=1;
输出结果是5,
下面就利用clone实现如上情况输出结果是1.
克隆的实现需要一下几步:
在派生类中覆盖基类的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 stub Node 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克隆方法,写得太棒了! Java中对象的创建 clone 顾名思义就是 复制 , 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。
深入浅出Java中的clone克隆方法,写得太棒了! Java中对象的创建 clone 顾名思义就是 复制 , 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。
Java总结 - clone总结 clone简介 即复制一个对象出来,他存在Object类中,是一个本地方法,并且修饰符是protected,所以他是可以让其子类实现自己的clone方法的 protected native Object clone() throws CloneNotSupportedException; 与n...
傲海 著有《机器学习实践应用》,阿里云机器学习PAI产品经理,个人微信公众号 ldquo;凡人机器学习 rdquo;。
相关文章
- java正则校验,密码必须由字母和数字组成
- Java反射之Method对象详解
- java设计模式--创建模式--原型模式
- Java连接RabbitMQ实例
- java之多态(四)
- JAVA 内部类 (三)实例
- Jquery UI 中Tree组件的json格式,java递归拼接demo
- Java对象实例化过程
- java输入输出流实验总结,写的太详细了
- Java HashMap实例源码分析
- [Java]Maven构建时报错: "Error:java: 读取E:XXXXX..jar时出错; error in opening zip file"
- 甲骨文宣布因 '主要增强功能'延迟发布Java EE 8
- 【Java】创建目录
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
- Java 基础面试题——集合
- 1046 划拳(JAVA)
- Java抽象类及子类实例化顺序和方法调用顺序测试
- 【Java】SpringBoot 引入fastjson库进行json格式数据返回实例