java对象拷贝
Ⅰ java 拷贝对象工具类有哪些
其他普通类::从beanInfo【每一个对象都有一个缓存的bean信息,包含属性字段等】取出name,然后把sourceClass和targetClass逐个拷贝
Ⅱ java如何深度一个object
方法一:把对象序列化之后再反序列化,之后得到的对象就是深度克隆的对象;
方法二:自己重写方法,不过有点麻烦。
Ⅲ java浅拷贝的对象两个内向相等吗
两个对象内向相等。
java对象默认继承java。long。Object类,里面包含clone方法。JDKAPI的说明文档解释这个方法将返回Object对象的一个拷贝。要说明的有两点:一是拷贝对象是一个新对象,而不是一个引用。二是拷贝对象与用new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。
java中的基本数据类型判断是否相等,直接使用==就行了,相等返回true,否则,返回false。
Ⅳ java 已知一个对象的引用,如何复制一个对象呢
obj.clone();2楼那个只是两个引用指向一个对象!
Ⅳ java复制对象时字段新增前缀
Java 对象的一共有 3 种复制对象的方式。
1.直接赋值 (引用复制 ),此种复制方式比较常用。
诸如 A a = b ; a 是直接复制了b的引用 ,也就是说它俩指向的是同一个对象。 此时 a == b [ true ] 。
.png
.png
1 classA{2 privateString string;3 A(){string = new String("original state");}4 public void set(String string) {this.string =string;}5 public String get() {returnstring;}6 }7
8 public classB{9 public static voidmain(String[] args) {10 //TODO 自歼举陆动生成的方法存根
11 A a = newA();12 A b =a;13 System.out.println(a ==b);14 a.set("state has changed");15 System.out.println(a ==b);16 }17 }
View Code
2.浅拷贝 ------- 复制当前对象的非静态字段【静态字段只在类加载的时候加载一次】,如果当前字段为 值类型 字段,那么直接复制该字段,如果是 引用类型 的,则对其复制引用。
所谓答仔的值类型就是指Java中的8种基本类型,那么什么是值类型的复制呢?
举个例子 int A = 0; int B = A; 那么这样B拷贝的是A指向的常量对象,而非A的引用,当A改变时,并不会影响B的指向。【Ps: A =1; 则B = 0 ,而非 1 , 这就是值类型的复制】
所谓的引用类型就是一些你自己构建的类和库中的一些类实例化出来的对象,引用复制又指的啥呢?
举个例子
class A {public int value = 0 ; } ====> A a = new A(); A b = a; =====> a.value = 1; 那么 ==> b.value = 1; 因为它们指向的是同一个对象【复制的是引用】
.png
.png
1 class B implementsCloneable{2
3 privateC c;4
5 privateString string ;6 public B() {string = new String("Init string"); c = newC();}7 public void set(String string) {this.string =string;}8 public String get() {returnstring;}9
10 /氏顷/setC()方法中添加一句 c = new C() ,就变为深拷贝了,因为添加了 这句代码, 拷贝 引用类型时,就变成拷贝其对象,而不是引用了
11 public voidsetC(String string) {c.set(string);}12 public String getC() {returnc.get();}13
14
15 @Override16 publicObject clone() {17 B sCopy = null;18 try{19 sCopy = (B)super.clone();20 }catch(Exception e) {21 e.printStackTrace();22 }23 returnsCopy;24 }25 }26 public static voidmain(String[] args) {27 //TODO 自动生成的方法存根
28
29
30 B sCopyA = newB();31 B sCopyB =(B) sCopyA.clone();32
33 sCopyA.set("hava changed !");34 //sCopyA.string = hava changed ! ------- sCopyA.string = Init string35 //改变了 sCopyA 并没有改变 sCopyB。 因为 B.string 是一个值类型
36 System.out.println("sCopyA.string = "+ sCopyA.get()+" ------- sCopyA.string = "+sCopyB.get());37
38 sCopyB.setC("C have Changed !");39 //C.string = C have Changed ! ------- C.string = C have Changed !40 //改变了 sCopyA 同时也改变 sCopyB。因为 B.string 是一个引用类型
41 System.out.println("C.string = "+ sCopyA.getC()+" ------- C.string = "+sCopyB.getC());42 }
View Code
3.深拷贝 ------- 和浅拷贝的区别就在于,其不管字段类型是什么,统统的全给拷贝过去【即使相对与 非基本类型而言 拷贝的也是对象而不是引用 ,深拷贝之后将会产生2个对象 ,浅拷贝只是一个对象的2个引用而已(相当于1个人的2个名字)】。
我们只要在 2的基础上添加一行代码就行, 因为只要将 引用字段,也进行复制 ,就是深拷贝了。
附:1.clone()方法 需要覆写。 2.覆写clone()方法需要实现Cloneable 接口, 未实现的话会抛出异常。 3 .clone()是本地方法,其内部实现如下图。
.png
Ⅵ java代码 clone()函数的作用是什么
从楼主对回答的追问上发现,楼主的连JAVA基本的语法都很差啊。=号是赋值运算符,不是比较。
double[] vectorValue;
vectorValue = vectorValue.clone();
这个段代码执行肯定报错了。但他还的意思还是很明确的。
首先:double[] vectorValue; 这个是定义了一个double类型的数组变量vectorValue。
其次:vectorValue = vectorValue.clone(); //这个是将vectorValue 克隆一份,赋值给自己。也就是说vectorValue变量指向了新的一块内存区域。
举个例子可能更能说明问题。
{
privateinti;
publicTestMain(inti){
this.i=i;
}
@Override
protectedObjectclone(){
//TODOAuto-generatedmethodstub
returnnewTestMain(this.getI()+1);
}
publicintgetI(){
returni;
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
TestMaintm1=newTestMain(1);
TestMaintm2=tm1;
tm1=(TestMain)tm1.clone();
System.out.println(tm1.getI());//tm1指向的是通过clone()方法创建的新的对象的地址,i的值已经是2了。
System.out.println(tm2.getI());//tm2指向的还是tm1创建时的地址,i的值为1
}
}
Ⅶ java如何实现对象的深克隆
/**定义用户**/
publicclassUser{
privateStringname;
privateAddressaddress;
//constructors,gettersandsetters
}
/**地址**/
publicclassAddress{
privateStringcity;
privateStringcountry;
//constructors,gettersandsetters
}
重载clone()方法
Object父类有个clone()的拷贝方法,不过它是protected类型的,
我们需要重写它并修改为public类型。
除此之外,子类还需要实现Cloneable接口来告诉JVM这个类是可以拷贝的。
重写代码
让我们修改一下User类,Address类,实现Cloneable接口,使其支持深拷贝。
/**
*地址
*/
{
privateStringcity;
privateStringcountry;
//constructors,gettersandsetters
@Override
publicAddressclone(){
return(Address)super.clone();
}
}
/**
*用户
*/
{
privateStringname;
privateAddressaddress;
//constructors,gettersandsetters
@Override
publicUserclone(){
Useruser=(User)super.clone();
user.setAddress(this.address.clone());
returnuser;
}
}
需要春轿注意的是,super.clone()其实是浅拷贝,
所以在重写User类的clone()方法时,address对象需要调用address.clone()重新赋值。
扩展:
为什么要克隆?
大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗?
答案是:克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?可以是可以,但前老是一来麻烦不说,二来,大家通过上面的源码都发现了clone是一个native方法,就是快啊,在底层实现的。
提个醒,我们常见的Objecta=newObject();Objectb;b=a;这种形式的代码复制的是引用,即对扒悔肆象在内存中的地址,a和b对象仍然指向了同一个对象。
而通过clone方法赋值的对象跟原来的对象时同时独立存在的。
Ⅷ java中构造方法和拷贝构造方法是什么意思
构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法。对象的创建就是通过构造方法袜伍来完成,其功能主要是完成对象的初始化。当类实例蚂备化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
拷贝构造方法就是用一个已经实例化的对象来new另一个对象
给个例子:
publicclassTest{
privateinthour;
privateintminute;
privateintsecond;
//构造方法
publicTest(){
}
//拷贝构告物或造方法
publicTest(Testt){
super();
this.hour=t.hour;
this.minute=t.minute;
this.second=t.second;
}
}
Ⅸ java深拷贝和浅拷贝的区别
浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制
深拷贝:对象,对象内部的引用均复制
示例:
publicstaticObject(ObjectoldObj){
Objectobj=null;
try{
//Writetheobjectouttoabytearray
ByteArrayOutputStreambos=newByteArrayOutputStream();
ObjectOutputStreamout=newObjectOutputStream(bos);
out.writeObject(oldObj);
out.flush();
out.close();
//
//aoftheobjectbackin.
ByteArrayInputStreambis=newByteArrayInputStream(bos.toByteArray());
ObjectInputStreamin=newObjectInputStream(bis);
obj=in.readObject();
}catch(IOExceptione){
e.printStackTrace();
}catch(ClassNotFoundExceptioncnfe){
cnfe.printStackTrace();
}
returnobj;
}
Ⅹ java 中对象赋值 是浅拷贝还是深层拷贝
对于对象赋值,引用类型是浅拷贝,复制的是引用(即地址),基本类型是深层拷贝(直接复制值)。