Java对象的浅克隆

/**
 * Java对象的浅克隆
 * 在克隆对象时,如果对象的成员变量是基本类型,则使用浅克隆即可完成。
 * 如果对象的成员变量包括可变引用类型,则需要深克隆
 * 如果引用类型是不可变的,如String类,则不必进行深克隆
 * 当需要克隆对象时,需要使用clone()方法,该方法将类中的各个域进行复制,
 * 如果对于引用类型的域,这种操作就会有问题,因此成为浅克隆。
 * 提供克隆功能的类需要实现Cloneable接口,否则会抛出异常
 */
public class Address{

	private String state;
	private String province;
	private String city;
	public Address(String state, String province, String city) {
		this.state = state;
		this.province = province;
		this.city = city;
	}
	public String getState() {
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	@Override
	public String toString() {
		return "Address [state=" + state + ", province=" + province + ", city="
				+ city + "]";
	}
	
public class Employee implements Cloneable {

	private String name;
	private int age;
	//新增Address对象
	private Address address;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Employee(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public Employee(String name, int age, Address address) {
		this.name = name;
		this.age = age;
		this.address = address;
	}

	public Address getAddress() {
		return address;
	}
	public void setAddress(Address address) {
		this.address = address;
	}
	public Employee() {
	}
	@Override
	public String toString() {
		return "Employee [name=" + name + ", age=" + age + ", address="
				+ address + "]";
	}

	//实现浅克隆
	@Override
	protected Employee clone() throws CloneNotSupportedException {
		Employee emp = null;
		try {
			emp = (Employee) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return emp;
	}
}

测试:

public class TestEmployeeAndAddress {

	public static void main(String[] args) throws CloneNotSupportedException {
		System.out.println("克隆之前:");
		Address address = new Address("中国", "吉林", "长春");
		Employee emp1 = new Employee("张XX",30,address);
		System.out.println("员工1的信息:"+emp1);
		System.out.println("克隆之后:");
		Employee emp2 = emp1.clone();
		emp2.getAddress().setState("中国");
		emp2.getAddress().setProvince("四川");
		emp2.getAddress().setCity("成都");
		emp2.setName("李XX");
		emp2.setAge(24);
		System.out.println("员工1的信息:"+emp1);
		System.out.println("员工2的信息:"+emp2);
	}
}

结果如下:

时间: 2024-08-05 23:16:18

Java对象的浅克隆的相关文章

Java对象的浅克隆和深克隆

为什么需要克隆 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B, 并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的.在Java语言中,用简单的赋值语句是不 能满足这种需求的,要满足这种需求有很多途径.     克隆的实现方式   一.浅度克隆      浅度克隆对于要克隆的对象,对于其基本数据类型的属性,复制一份给新产生的对象,对于非基本数据类型的属性,仅仅

java基础入门-对象的浅克隆与深克隆

这里面涉及到两个类,一个是person类,一个是测试类test 首先我们说到的是浅克隆,对某个对象实施Clone时对其是一无所知的,它仅仅是简单地执行域对域的copy,如果是基本数据类型(int,float,char等)到没什么问题,基本遇上如string,Integer等不可变对象的时候也没有什么问题,但是如果遇上了date这个可变对象,或者是自己定义的可变对象,他只是简单的复制一下引用这些可变对象,而不是把这些可变对象再一次的复制 先上person类,这里面虽然是实现Cloneable接口,

java对象的克隆

java对象克隆方式主要有两种:浅克隆和深克隆 首先,不要把对象的克隆和对象的赋值搞混了,看下图 p2 = p1;就是赋值操作,赋值操作只是让被赋值对象指向之前对象的地址,实际上的物理内存是一块,而克隆操作的结果应该是两个对象分别指向内容相同的两块内存.如下就是克隆操作后的状态: 下面说浅克隆和深克隆: 深克隆和浅克隆的区别主要出现在类里有外部类对象时,如下,Person类中有Address类的对象 1 package cn.itcast.copy; 2 3 import java.io.Ser

深入理解Java对象的创建过程:类的初始化与实例化

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 深入理解Java对象的创建过程:类的初始化与实例化 - Rico's Blogs - 博客频道 - CSDN.NET Rico's Blogs 潜心修炼,成为一个更好的人. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅

(转)深入理解Java对象的创建过程

参考来源:http://blog.csdn.net/justloveyou_/article/details/72466416 摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化.在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化.本文试图对JVM执行类初始化和实例化的过程做一个详细深入地介绍,以便从Java虚拟机

Java中的浅克隆(shallow clone)与深克隆(deep clone)

Summary 浅克隆与深克隆对于JavaSE来说,是个难度系数比较低的概念,但不应该轻视它. 假设一个场景:对于某个list,代码里并没有任何对其的直接操作,但里面的元素的属性却被改变了,这可能就涉及到这个概念. Description 浅克隆指仅copy对象位于栈内存中的引用(reference).copy后,新旧两个引用指向同一个堆内存对象(即同一内存区域),但是堆内存中实际的对象copy前后均只有一个.使用"==" operator比较二者的地址会返回true.(不同引用,同一

Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨

Java对象克隆(Clone)及Cloneable接口.Serializable接口的深入探讨 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的克隆,就不得不说为什么要对对象进行克隆.Java中所有的对象都是保存在堆中,而堆是供全局共享的.也就是说,如果同一个Java程序的不同方法,只要能拿到某个对象的引用,引用者就可以随意的修改对象的内部数据(前提是这个对象的内部数据通过get/set方法曝露出来).有的时候,我们编写的代码想让调用者只获得该对象的一个拷贝(也

Java对象深复制、浅复制

我们在编码过程经常会碰到将一个对象传递给另一个对象,java中对于基本型变量采用的是值传递,而对于对象比如bean传递时采用的引用传递也就是地址传递,而很多时候对于对象传递我们也希望能够象值传递一样,使得传递之前和之后有不同的内存地址,在这种情况下我们一般采用以下两种情况. 浅复制与深复制概念 浅复制(浅克隆) :被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. 深复制(深克隆) :被复制对象

【JAVA零基础入门系列】Day14 Java对象的克隆

今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢?什么时候需要使用呢?先来看一个小栗子: 简单起见,我们这里用的是Goods类的简单版本. public class Goods { private String title; private double price; public Goods(String aTitle, double aPri