java,对象的克隆

这次写的是有关java对象的克隆

首先是 java对象的假克隆

对于基本类型我们可以用“=”来进行克隆,此时对于两个变量除了相等没有其他的关系

但对于引用类型来说就不能简单的使用“=”来进行克隆,这样java的内存空间使用有关

对于引用变量而言,使用“=”将修改引用,而不是复制堆中的对象。此时两个引用对象

将指向同一个对象。示例代码如下:

1)创建一个Employer类

2)创建一个Demo类进行输出实验

3)结果可以自行运行

备注;如果应用类型是不可变的,如String类则不用进行深克隆,即你可以把String类型像基本类型看待

/*
 * 定义两个成员变量和两个方法,get 和 set
 */
public class Employer {
	String name;
	int age;

	public Employer(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	
	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;
	}

    @Override
    public String toString() {
    	// TODO Auto-generated method stub
    	//return super.toString();
    	return "姓名:"+name+" 年龄 "+age;
    }
}
public class Demo {
	public static void main(String args[]) {
		 System.out.println("克隆前");
		 Employer e1=new Employer("林青霞", 58);
		 System.out.println("雇主一的信息");
		 System.out.println(e1);
		 System.out.println("克隆后");
		 Employer e2=e1;
		 e2.setName("王祖贤");
		 e2.setAge(48);
		 System.out.println("雇主1的信息");
		 System.out.println(e1);
		 System.out.println("雇主2的信息");
		 System.out.println(e2);
   }
}


下面讲解的是浅克隆

首先是定义的类需要继承Cloneable类,并重写其中的clone()方法

1)首先定义一个Love类

2)创建一个CopyOfEmployer类继承Cloneable ,重写clone()方法

3)创建Demo测试类,测试CopyOfEmployer类

示例代码如下

public class Love {
	public String people;
	public int number;

	public String getPeople() {
		return people;
	}

	public void setPeople(String people) {
		this.people = people;
	}

	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}
    
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		StringBuilder sb=new StringBuilder("喜欢的人:");
		sb.append(people).append(" 喜欢的数字:").append(number);
		return sb.toString();
	}
}

CopyOfEmployer类

public class CopyOfEmployer implements Cloneable{
	String name;
	int age;
	Love love;

	public Love getLove() {
		return love;
	}
	public void setLove(Love love) {
		this.love = love;
	}
	@Override
	public CopyOfEmployer clone(){
		// TODO Auto-generated method stub
		CopyOfEmployer coe=null;
		try {
			coe=(CopyOfEmployer) super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  //实现浅克隆;
		//coe.love=(Love) love.clone();
		return coe;
	}
	public CopyOfEmployer(String name,int age,Love love)
	{
		this.name=name;
		this.age=age;
		this.love=love;
	}
	
	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;
	}

    @Override
    public String toString() {
    	// TODO Auto-generated method stub
    	//return super.toString();
    	return "姓名:"+name+" 年龄 "+age+" 喜爱的东西:"+love;
    }
}

Demo测试类,下面只是写出了main中的内容

  Love love=new Love();
        love.setNumber(18);
        love.setPeople("husband");
		System.out.println("克隆前");
		CopyOfEmployer e1 = new CopyOfEmployer("林青喜", 58,love);
		System.out.println("雇主一的信息");
		System.out.println(e1);
		System.out.println("克隆后");
		CopyOfEmployer e2 = null;
		e2 = e1.clone();
		e2.setName("王祖贤");
		e2.setAge(48);
		e2.getLove().setNumber(16);
		e2.getLove().setPeople("小鲜肉");
		System.out.println("雇主1的信息");
		System.out.println(e1);
		System.out.println("雇主2的信息");
		System.out.println(e2);


最后要讲的是深克隆

其实就是让Love类也继承Cloneable类,因为只是浅克隆的话,Love类并没有被克隆岛,所以修改如下

Love类

public class Love implements Cloneable{
	public String people;
	public int number;

	@Override
	protected Love clone() {
		// TODO Auto-generated method stub
		Love love=null;
		try {
			love=(Love) super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return love;
	}
	public String getPeople() {
		return people;
	}

	public void setPeople(String people) {
		this.people = people;
	}

	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}
    
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		StringBuilder sb=new StringBuilder("喜欢的人:");
		sb.append(people).append(" 喜欢的数字:").append(number);
		return sb.toString();
	}
}

其他的类和浅克隆中的一样,大家可以自行测试

最后希望大家给予我良好的修改意见,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值