您的位置:首页 > 编程语言 > Java开发

Java 基础数据类型 和 深度克隆对象的2种方法(实现Cloneable接口或者实现对象序列化)

2016-01-05 14:10 1071 查看
知识点1(java有9种传递函数参数时是传值):

8大基础数据类型加String:

1,字节 byte  

2,短整型 short 

3,整型int 

4,长整形 long 

5,字符型 char 

6,浮点型 float 

7,双精度型 double 

8,布尔型 boolean

9,String

这8大基础类型+String是传值。

知识点2(深度克隆对象的三个方法):

方法1.

import java.util.ArrayList;

/**
* 1.必须实现Cloneable接口.
* 2.写clone方法的话,在clone中代码上每一处都要实现深复制.
* @author jianan
*/
class Work implements Cloneable{
private String strText;
private ArrayList<String> array = new ArrayList<String>();

@SuppressWarnings("unchecked")
@Override
protected Work clone(){
Work work;
try {
work = (Work)super.clone();
work.strText = this.strText;
work.array = (ArrayList<String>) (this.array.clone()); //深克隆
return work;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}

public void addImage(String imgName){
array.add(imgName);
}

public void setText(String strText){
this.strText = strText;
}

public void display(String str){
System.out.println(str);
System.out.println("Text:" + strText);
for(int i = 0; i < array.size(); i++){
System.out.println("Image:" + array.get(i));
}

System.out.println();
}
}

//测试函数
public class Main {

public static void main(String[] args) {
Work work = new Work();
work.setText("111");
work.addImage("1.png");
work.addImage("2.png");
work.addImage("3.png");
work.display("111");

Work work2 = work.clone();
work2.setText("2");
work2.addImage("4.png");
work2.addImage("5.png");
work2.addImage("6.png");
work2.display("222");

work.display("111");
}
}
方法2.

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
/**
* 1.实现Serializable接口即可.toString方法不用重写因为该接口里面本身就为空.
* @author jianan
*/
//深克隆 工具
class DepthCloneUtil{
public static Object depthClone(Object srcObj){
Object cloneObj = null;
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(out);
oo.writeObject(srcObj);
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream oi = new ObjectInputStream(in);
cloneObj = oi.readObject();
} catch (IOException e) {
e.printStackTrace();
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
return cloneObj;
}
}

//
class Work implements Serializable{
private static final long serialVersionUID = -3219618174845671783L;  //会自动补充的
private String strText;
private ArrayList<String> array = new ArrayList<String>();

public void addImage(String imgName){
array.add(imgName);
}

public void setText(String strText){
this.strText = strText;
}

public void display(String str){
System.out.println(str);
System.out.println("Text:" + strText);
for(int i = 0; i < array.size(); i++){
System.out.println("Image:" + array.get(i));
}

System.out.println();
}
}

//测试函数
public class Main {

public static void main(String[] args) {
Work work = new Work();
work.setText("111");
work.addImage("1.png");
work.addImage("2.png");
work.addImage("3.png");
work.display("111");

Work work2 = (Work)DepthCloneUtil.depthClone(work); //如果采用对象序列化的话,
work2.setText("2");
work2.addImage("4.png");
work2.addImage("5.png");
work2.addImage("6.png");
work2.display("222");

work.display("111");
}
}

方法3

直接写一个clone方法。

2种方式都实现了深度克隆,输出结果都是:

/*
111
Text:111
Image:1.png
Image:2.png
Image:3.png

222
Text:2
Image:1.png
Image:2.png
Image:3.png
Image:4.png
Image:5.png
Image:6.png

111
Text:111
Image:1.png
Image:2.png
Image:3.png
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: