这次写的是有关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();
}
}
其他的类和浅克隆中的一样,大家可以自行测试
最后希望大家给予我良好的修改意见,谢谢!