1
Object中的clone(),是protected的。
要想调用clone()复制,需要这个对象实现Clonable接口,并覆写成public的clone
2
在覆写的clone中如果直接调用super。clone()
那么是浅拷贝
3
要进行深拷贝,则需要自己重写clone()函数
又有两种方法
a 逐个对象递归调用clone(此时要求各组件也实现Cloneable接口)
b 利用序列化(此时要求各组件也实现Serizliable接口)
举例
(注意Outer类中的clone的两种实现即可)
package simpleTest;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class MyOuter implements Cloneable,Serializable{
private int i;
private MyInner inner;
public MyOuter(int i, MyInner inner) {
super();
this.i = i;
this.inner = inner;
}
/**
* 深拷贝法一
*/
// @Override
// public Object clone() throws CloneNotSupportedException{
// MyOuter out = (MyOuter) super.clone();
// out.inner = (MyInner)inner.clone();
// return out;
// }
/**
* 深拷贝法二
* @throws IOException
*/
@Override
public Object clone() throws CloneNotSupportedException{
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos;
oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
} catch (IOException e) {
return null;
} catch (ClassNotFoundException e) {
return null;
}
}
@Override
public String toString(){
return "i = " + i + " and inner.j= " + inner.getJ();
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public MyInner getInner() {
return inner;
}
public void setInner(MyInner inner) {
this.inner = inner;
}
}
class MyInner implements Cloneable,Serializable{
private int j;
public MyInner(int j) {
super();
this.j = j;
}
@Override
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
public int getJ() {
return j;
}
public void setJ(int j) {
this.j = j;
}
}
public class Demo {
public static void main(String[] args) {
MyInner inner = new MyInner(1);
MyOuter outer = new MyOuter(2,inner);
System.out.println(outer);
try {
MyOuter copy = (MyOuter) outer.clone();
System.out.println(copy);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
clone的用法 希望有帮助,仅供参考 通过例子的分析,可以对克隆的方法有所深入了解
Java中clone方法共6页.pdf.zip
java中clone的详细用法,分浅拷贝和深拷贝,并分别有详细的实例介绍。从原理分析。
详细的描述了Java中 clone方法使用
主要介绍了java 中clone()的使用方法的相关资料,希望通过本文能帮助大家能掌握clone()的克隆方法,需要的朋友可以参考下
java中clone的详细用法,分浅拷贝和深拷贝,并分别有详细的实例介绍。从原理分析。
Java中的clone方法详解_动力节点Java学院,动力节点口口相传的Java黄埔军校
主要介绍了Java中clone的写法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
Java深浅clone测试代码 流拷贝 Cloneable
Java克隆(Clone)是Java语言的特性之一,本篇文章主要介绍了Java中的Clone机制是如何工作的,需要的朋友可以参考下
java code clone
用 Java 语言编写的 初学者可学习的clone()
现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个词语确实很“火”过一阵子,在java中也有这么一个概念,它可以让我们很方便的“制造”出一个对象的副本来,下面来具体看看java中的Clone机制是如何工作的...
对java clone的一些讲解,以及我个人的一些心得等等,
Java的clone方法[归类].pdf
Java Clone(类的复制)实例代码 Java Clone(类的复制)实例代码
java中仅有的创建对象的两种方式:①.使用new操作符创建对象;②.使用clone方法复制对象。下面这篇文章主要通过JVM角度给大家详细谈谈Java的clone操作的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以...
Clone 属性的相关内容 Clone 属性的相关内容