java深克隆
类的属性如果是引用类型的 那么继续执行属性的 clone方法即可(属性要实现Cloneable接口)
❷ java的深复制和浅复制
java中有一抄个对象池,当执行A a1 = new A()时,会在对象池中生成一个A的对象,并把这个对象的引用给a1;
浅拷贝就是如A a2 = a1,这时候对象池中只有一个A对象,只不过这个对象多了个a2的引用,此时a1和a2指向的是同一个对象;
深拷贝就是在对象池中再生成一个A对象给a2,这个A对象跟a1指向的A对象内容、引用等都一样,但此时a1和a2指向的是不同的两个对象。
❸ java如何深度一个object
java深复制的例子:
1、创建Employer类,实现Cloneable接口:
class Employer implements Cloneable{
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
2、创建Employee类,实现Cloneable接口,并改写clone方法,实现深复制:
class Employee implements Cloneable{
private String username;
private Employer employer;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Employer getEmployer() {
return employer;
}
public void setEmployer(Employer employer) {
this.employer = employer;
}
@Override
public Object clone() throws CloneNotSupportedException {
//克隆Employee对象并手动的进一步克隆Employee对象中包含的Employer对象
Employee employee = (Employee)super.clone();
employee.setEmployer((Employer) employee.getEmployer().clone());
return employee;
}
}
3、这样,在客户端拷贝的两个Employee对象的Employer就互不影响了:
public static void main(String[] args) throws CloneNotSupportedException {
Employer employer = new Employer();
employer.setUsername("arthinking");
Employee employee = new Employee();
employee.setUsername("Jason");
employee.setEmployer(employer);
//employee2由employee深复制得到
Employee employee2 = (Employee) employee.clone();
//这样两个employee各自保存了两个employer
employee2.getEmployer().setUsername("Jason");
System.out.println(employee.getEmployer().getUsername());
System.out.println(employee2.getEmployer().getUsername());
}
❹ Java中的浅克隆与深克隆 ,有可以区别开的实例吗求大神指点
浅克隆 就是只克隆类的属性,子对象的属性就不管了。
深克隆,就当前类属性、子对象、子子对象属性、、、、、、全克隆了
❺ JAVA如何实现深拷贝
下面给你简单介绍protected 域(或方法)实现过程思路:
protected 域(或方法)对本包内的所有类可见(当然包括子类),那么,子类可以获得访超类受保护域(或方法)的权利,但是,若子类和超类不在同一个包下,就不能访问超类对象的这个受保护域(或方法)。
浅拷贝与深拷贝
Object类对自己的具体子类的域一无所知,Object类的clone方法只是将各个域进行拷贝。数值或基本类型不会出现问题,但是,如果在对象中包含了引用对象,这些对象的内容没有被自我复制,拷贝的结果也即是原始对象和拷贝对象引用着同一个引用对象(一般地,动词“引用”可理解为“管理”,就是指向同一内存)。
浅拷贝满足:
x.clone() != x为 true,
x.clone().getClass() == x.getClass()为true,
((x.clone().field1 ) == (x. field1))&& … &&((x.clone().fieldN )==(x. fieldN))也为 true 。
如果原始对象与浅拷贝对象共同引用(管理、指向)的引用对象是不可变的,将不会产生任何问题
如果原始对象管理的引用对象是可变的,就必须需重新定义clone方法,来实现深层次的拷贝。要对涉及的每一个类,判断以下两点:
默认的clone方法是否满足需求。
默认的clone方法是否能通过调用可变引用对象的clone方法得到解决。
对涉及的每一个类,深拷贝要满足:
x.clone() != x为 true,
x.clone().getClass() == x.getClass()为true,
x.clone().equals(x)也为 true ,当然equals方法是如此重写过的。
Object类中的clone方法被声明为protected,防止出现文章开头所提到的,子类和超类不在同一个包下的情况,要声明clone为public,来实现深拷贝
❻ java中的浅克隆和深克隆是什么
克隆是指克隆对象,在堆空间复制一块内存,是完全的两个对象,不是指针指向!浅克隆是指克隆一个对象,而该对象的属性只是基本数据类型,只克隆出该对象!深度克隆是指克隆的目标里面还有引用类型,引用类型里还有引用类型,同时把引用类型克隆出来叫深度克隆!常用的方法有两种,第一,需克隆的对象实现cloneable接口;第二,使用commons包提供的克隆方法。这两种方法都能实现深度克隆!
❼ java深克隆
deep ,自己看:
http://blog.csdn.net/liuchao1211/article/details/3277955
❽ java中深克隆与浅克隆的区别
深克隆与浅克隆
大家知道,对象是互相引用的,即对象中可能包含了另一个对象的引用,举例如:有一个Order对象,Order对象中又包含了LineItems对象,然后LineItems对象又包含了Item对象。
好了,现在我有一个Order对象order1,它包含了一个LineItems对象items,这表示的是有一个订单order1,订单的内容是items。
好的,现在有另一个客户想要一份订单,内容跟order1完全一样,那么在系统的逻辑层我们怎么做呢?很简单,order2=order1.clone(). 我们知道clone方法是在内存中生成一个新的对象,而不是只得到原对象的引用。这时候,有人说话了:“哦,明白了我们对order2的成员变量进行修改,是不会影响order1的。” 很可惜,这句话只对了一半。
假设order类有一个成员变量name,当然改变order2.name不会影响order1.name,因为他们在不同的内存区域。但是如果改变 order1.items呢?很遗憾,简单地使用order1.clone,是会影响到order2.items的。原因很简单,就是因为clone方法默认的是浅克隆,即不会克隆对象引用的对象,而只是简单地复制这个引用。所以在上例中,items对象在内存中只有一个,order1和order2都指向它,任何一个对象对它的修改都会影响另一个对象。
那相对浅克隆,深克隆自然就是会克隆对象引用的对象了。也就是说,在上例中,改变order1.items并不会影响order2.items了。因为内存中有两个一样的items。
如果实现深克隆?
一个方法自然是重写clone方法,添加如order.items=(LineItems)items.clone()的语句,也就是人为地添加对引用对象的复制。这个方法的缺点是如果引用对象有很多,或者说引用套引用很多重,那么太麻烦了。业界常用的方法是使用串行化然后反串行化的方法来实现深克隆。由于串行化后,对象写到流中,所有引用的对象都包含进来了,所以反串行化后,对等于生成了一个完全克隆的对象。绝!
这个方法的要求是对象(包括被引用对象)必须事先了Serializable接口,否则就要用transient关键字将其排除在复制过程中。
❾ java,,"浅克隆,只复制一个对象 ,深克隆 对象和引用一起复制"有java实例吗不理解啊
对只包抄含进本类型的类来说袭,无所谓深克隆。但是一个类包含集合类或者复杂的类,就要考虑二者的区别了。
class Student {
private int id;
private Address address;
private ArrayList<Book> bookList;
}
对于以上类的一个对象a和克隆类 o来说:
浅克隆:
a !=o 但是 a.address == o.address, a.bookList == o.bookList
深克隆:
a !=o 但是 a.address != o.address, a.bookList != o.bookList
并且 bookList中的每个元素不是相同对象。
简言之, 浅克隆只复制本对象,深克隆除了本对象,其儿子、孙子、....都要克隆。
以上纯手敲,有错请包涵。
❿ 浅复制和深复制的区别 java
浅复制和深复制的区别 java
大体上来说,深拷贝与浅拷贝的区别主要还是在于指针(或与指针)方面,浅拷贝只是简单的把源对象(这个是指广义的对象,不仅仅单指类的实例)的指针赋值给目标对象,对目标指针的操作就是对源对象的操作,所以在很多情况下,目标对象析构(或跳出其可见域)之后,源对象相关部分也就一同析构了。而深拷贝,是为目标对象重新分配空间,这样可以与源对象的操作分开。