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 中對象賦值 是淺拷貝還是深層拷貝
對於對象賦值,引用類型是淺拷貝,復制的是引用(即地址),基本類型是深層拷貝(直接復制值)。