拉萨市建材网络科技有限公司
首页 | 联系方式 | 加入收藏 | 设为首页 | 手机站

产品目录

联系方式

联系人:业务部
电话: 00165-55511
邮箱:service@ydkmjgds.com

当前位置:首页 >> 产品展示 >> 默认分类 >> 正文

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

详细信息:

知识点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
*/


下一条:暂时没有!