Java中对象的复制/拷贝
来源:互联网 发布:组态软件控制系统 编辑:程序博客网 时间:2024/05/21 10:14
在Java中对对象的复制分为2种:浅复制和深复制。
浅复制:仅复制目标对象的引用,共享同一内存对象。所以,对原对象的修改同样作用于复制的对象,反过来也一样。
深复制:相当于重新创建一个和原对象相同类型的对象,并复制原对象的属性方法等。
例1:浅复制
首先创建 User,java 类
package com.clonetest;public class User{private String username;private String password;public User() {}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}创建测试类 CloneTestSimple.java
package com.clonetest;public class CloneTestSimple {public static void main(String[] args) {// Create User and initializeUser user = new User();user.setUsername("Tom");user.setPassword("tom");// Clone User Object and output parametersUser cloneUser;cloneUser = user;System.out.println("================ New clone user ===============");System.out.println("Origin user: " + user.getUsername() + ", "+ user.getPassword());System.out.println("Clone user: " + cloneUser.getUsername() + ", "+ cloneUser.getPassword());// Update useruser.setUsername("Jerry");user.setPassword("Jerry");System.out.println("================ After update user ===============");System.out.println("Origin user: " + user.getUsername() + ", "+ user.getPassword());System.out.println("Clone user: " + cloneUser.getUsername() + ", "+ cloneUser.getPassword());// Update cloneUsercloneUser.setUsername("Tom an Jerry");cloneUser.setPassword("Tom and Jerry");System.out.println("================ After update clone user ===============");System.out.println("Origin user: " + user.getUsername() + ", "+ user.getPassword());System.out.println("Clone user: " + cloneUser.getUsername() + ", "+ cloneUser.getPassword());}}测试结果如下:
================ New clone user ===============
Origin user: Tom, tom
Clone user: Tom, tom
================ After update user ===============
Origin user: Jerry, Jerry
Clone user: Jerry, Jerry
================ After update clone user ===============
Origin user: Tom an Jerry, Tom and Jerry
Clone user: Tom an Jerry, Tom and Jerry
例2:深复制
2.1 通过实现 Cloneable 接口,重写 clone 方法实现:
改写上例中的 User.java 类
package com.clonetest;public class User implements Cloneable{private String username;private String password;public User() {}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic Object clone(){Object obj = null;try {obj = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return obj;}}改写测试类 CloneTestSimple.java :
package com.clonetest;public class CloneTestSimple {public static void main(String[] args) {// Create User and initializeUser user = new User();user.setUsername("Tom");user.setPassword("tom");// Clone User Object and output parametersUser cloneUser;cloneUser = (User) user.clone();System.out.println("================ New clone user ===============");System.out.println("Origin user: " + user.getUsername() + ", "+ user.getPassword());System.out.println("Clone user: " + cloneUser.getUsername() + ", "+ cloneUser.getPassword());// Update useruser.setUsername("Jerry");user.setPassword("Jerry");System.out.println("================ After update user ===============");System.out.println("Origin user: " + user.getUsername() + ", "+ user.getPassword());System.out.println("Clone user: " + cloneUser.getUsername() + ", "+ cloneUser.getPassword());// Update cloneUsercloneUser.setUsername("Tom an Jerry");cloneUser.setPassword("Tom and Jerry");System.out.println("================ After update clone user ===============");System.out.println("Origin user: " + user.getUsername() + ", "+ user.getPassword());System.out.println("Clone user: " + cloneUser.getUsername() + ", "+ cloneUser.getPassword());}}测试结果如下:
================ New clone user ===============
Origin user: Tom, tom
Clone user: Tom, tom
================ After update user ===============
Origin user: Jerry, Jerry
Clone user: Tom, tom
================ After update clone user ===============
Origin user: Jerry, Jerry
Clone user: Tom an Jerry, Tom and Jerry
2.2 通过实现 Serializable 接口,用序列化和反序列化实现:
创建测试类 Account.java
package com.clonetest;import java.io.Serializable;@SuppressWarnings("serial")public class Account implements Serializable {private String firstname;private String lastname;public Account(){}public String getFirstname() {return firstname;}public void setFirstname(String firstname) {this.firstname = firstname;}public String getLastname() {return lastname;}public void setLastname(String lastname) {this.lastname = lastname;}}改写测试类 CloneTestSimple.java :
package com.clonetest;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class CloneTestSimple {public static void main(String[] args) {Account account = new Account();account.setFirstname("Sherlock");account.setLastname("Homles");try {ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(account);ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);Account cloneAccount = (Account) ois.readObject();System.out.println("================ New clone account ===============");System.out.println("Origin account: " + account.getFirstname() + ", "+ account.getLastname());System.out.println("Clone account: " + cloneAccount.getFirstname() + ", "+ cloneAccount.getLastname());account.setFirstname("William");account.setLastname("Shakespeare");System.out.println("================ update origin account ===============");System.out.println("Origin account: " + account.getFirstname() + ", "+ account.getLastname());System.out.println("Clone account: " + cloneAccount.getFirstname() + ", "+ cloneAccount.getLastname());cloneAccount.setFirstname("Will");cloneAccount.setLastname("Smith");System.out.println("================ update clone account ===============");System.out.println("Origin account: " + account.getFirstname() + ", "+ account.getLastname());System.out.println("Clone account: " + cloneAccount.getFirstname() + ", "+ cloneAccount.getLastname());} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}}测试结果如下:
================ New clone account ===============
Origin account: Sherlock, Homles
Clone account: Sherlock, Homles
================ update origin account ===============
Origin account: William, Shakespeare
Clone account: Sherlock, Homles
================ update clone account ===============
Origin account: William, Shakespeare
Clone account: Will, Smith
- Java中对象的复制/拷贝
- JAVA中复制数组、对象数组拷贝
- js中对象的拷贝(复制)
- js中对象的复制,浅复制(浅拷贝)和深复制(深拷贝)
- Java中对象的复制
- java中对象的复制
- java中对象的复制
- java 中 对象的复制
- C++中浅拷贝、深拷贝、对象的复制、对象的赋值
- java中对象的拷贝(克隆)
- IOS中复制对象的用法及深拷贝和浅拷贝详解
- IOS中复制对象的用法及深拷贝和浅拷贝详解
- IOS中复制对象的用法及深拷贝和浅拷贝详解
- iOS中复制对象的用法及深拷贝和浅拷贝详解
- iOS中复制对象的用法及深拷贝和浅拷贝详解
- IOS中复制对象的用法及深拷贝和浅拷贝详解
- Java中实现复制的集中方式,深拷贝(深复制)和浅拷贝(浅复制)
- java对象的拷贝
- Linux目录架构详解 转自http://cloud.csdn.net/a/20120420/2804821.html?bsh_bid=90555089###
- 有道云笔记新版上线 深化本土应用合作
- 黑马程序员-----交通灯管理系统
- 关于青春
- cvGetSize与cvSize的区别
- Java中对象的复制/拷贝
- 第二章 变量和基本类型 (续1) 变量 & const 限定符
- socket
- 黑马程序员-----代理
- 配置Log4j(很详细)
- 红尘依梦
- The ultimate jQuery Plugin List ==JQuery插件列表
- dom4j解析XML时使用XPath直接定位至标签实例
- 新手学PL/SQL (1)