Java之对象的克隆

1.对象的浅克隆

1.一个对象如果要调用clone()方法,那么该对象所属的类必须实现Cloneable接口。

2.Cloneable接口是一个标识接口,没有任何方法。

3.对象的浅克隆:在克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候,只是克隆了另外一个对象的地址,而没有把另外一个对象也克隆一份

4.对象的克隆没有调用构造方法。

代码:

//City类
package day07;

public class City {
	private String name;
	public City(String name) {
		this.name=name;
	}
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}

//Worker类
package day07;

public class Worker implements Cloneable{
	//Cloneable是一个标识接口
	private String name;
	private double salary;
	private City city;
	public Worker() {
	}
	public Worker(String name,double salary,City city)
	{
		System.out.println("构造方法运行中");
		this.name=name;
		this.salary=salary;
		this.city=city;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	public String getCityName() {
		return city.getName();
	}
	public void setCityName(String cityName) {
		this.city.setName(cityName);
	}
	@Override
	public Object clone() throws CloneNotSupportedException {
		
		return super.clone();
	}	
	@Override
	public String toString()
	{
		return "姓名:"+this.name+"薪水:"+this.salary+"城市:"+this.city.getName();
	}
}
//Test
package day07;

public class CloneDemo {
	public static void main(String args[]) throws CloneNotSupportedException
	{
		City city=new City("长沙");
		Worker w1=new Worker("老林",5530.1,city);
		Worker w2=(Worker)w1.clone();
		w2.setCityName("北京");
		System.out.println(w1);
		System.out.println("-------------");
		System.out.println(w2);
	}
}

运行结果如下

2.对象的深克隆

对象的深克隆就是利用对象的输入输出流将对象先写到文件上,然后再读取对象的信息,这个过程就称为对象的深克隆。

代码:

package day07;

import java.io.Serializable;

public class City implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -4395851692262429808L;
	private String name;
	public City(String name) {
		this.name=name;
	}
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}

package day07;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Worker implements Cloneable,Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -425984482155520827L;
	//Cloneable是一个标识接口
	private String name;
	private double salary;
	private City city;
	public Worker() {
	}
	public Worker(String name,double salary,City city)
	{
		System.out.println("构造方法运行中");
		this.name=name;
		this.salary=salary;
		this.city=city;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	public String getCityName() {
		return city.getName();
	}
	public void setCityName(String cityName) {
		this.city.setName(cityName);
	}
	public void writeObject() throws IOException
	{
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:\\obj.txt"));
		oos.writeObject(this);
		oos.close();
	}
	public Object readObject() throws FileNotFoundException, IOException, ClassNotFoundException
	{
		ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\obj.txt"));
		Object w=ois.readObject();
		ois.close();
		return w;
	}
	@Override
	public Object clone() throws CloneNotSupportedException {
		
		return super.clone();
	}	
	@Override
	public String toString()
	{
		return "姓名:"+this.name+"薪水:"+this.salary+"城市:"+this.city.getName();
	}
}

package day07;

import java.io.IOException;

public class CloneDemo {
	public static void main(String args[]) throws CloneNotSupportedException, IOException, ClassNotFoundException
	{
		City city=new City("长沙");
		Worker w1=new Worker("老林",5530.1,city);
		Worker w2=(Worker)w1.clone();
		w1.writeObject();
		Worker w3=(Worker)w1.readObject();
		w3.setCityName("北京");
		System.out.println(w1);
		System.out.println("-------------");
		System.out.println(w2);
		System.out.println(w3);
	}
}

运行结果:

                                ----------------------------------共勉

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章