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);
}
}
运行结果: