Java中对象的复制/拷贝

本文详细介绍了Java中对象复制的两种方式——浅复制与深复制的区别与实现方法,通过实例展示了如何在Java中进行这两种复制操作,并分析了它们的使用场景与效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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 initialize
		User user = new User();
		user.setUsername("Tom");
		user.setPassword("tom");
		
		// Clone User Object and output parameters
		User 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 user
		user.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 cloneUser
		cloneUser.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;
	}
	
	@Override
	public 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 initialize
		User user = new User();
		user.setUsername("Tom");
		user.setPassword("tom");
		

		// Clone User Object and output parameters
		User 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 user
		user.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 cloneUser
		cloneUser.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值