Ⅰ java對象癿深復制和淺復制區別指什麼幫幫忙~~
淺拷貝:僅復制引用,即兩個引用指向同一個對象,如:
String aString = "hello";
String bString = aString;
深拷貝:復制對象的內容,Java里通過實現Clonnable並覆蓋clone方法實現,具體深度由clone的實現決定,如:
public class People implements Clonnable{
private int age;
private String name;
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
public void setName(String name){
this.name = name;
}
public String getAge(){
return this.name;
}
public Object clone(){
People people = new People();
people.setAge(this.age);
people.setName(this.name);
return people;
}
}
如果對您有幫助,請記得採納為滿意答案,謝謝!祝您生活愉快!
vaela
Ⅱ JAVA對象的淺復制和深復制是怎麼一回事啊
顯然,修改深復製得到的新值不會影響原值;
Ⅲ java淺拷貝的對象兩個內向相等嗎
兩個對象內向相等。
java對象默認繼承java。long。Object類,裡麵包含clone方法。JDKAPI的說明文檔解釋這個方法將返回Object對象的一個拷貝。要說明的有兩點:一是拷貝對象是一個新對象,而不是一個引用。二是拷貝對象與用new操作符返回的新對象的區別就是這個拷貝已經包含了一些原來對象的信息,而不是對象的初始信息。
java中的基本數據類型判斷是否相等,直接使用==就行了,相等返回true,否則,返回false。
Ⅳ java中什麼是深拷貝,什麼是淺拷貝
簡單點跟你說吧,容易理解。
淺拷貝:
就是復制對象的值的時候,不管復制多少,所以的值都指向同一個對象。
深拷貝:
在復制對象的值的時候,同時也重新創建了一個對象,每個值都指向一個不同的對象。
如果你學習了c語言的指針,會理解的更深刻
Ⅳ 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
大體上來說,深拷貝與淺拷貝的區別主要還是在於指針(或與指針)方面,淺拷貝只是簡單的把源對象(這個是指廣義的對象,不僅僅單指類的實例)的指針賦值給目標對象,對目標指針的操作就是對源對象的操作,所以在很多情況下,目標對象析構(或跳出其可見域)之後,源對象相關部分也就一同析構了。而深拷貝,是為目標對象重新分配空間,這樣可以與源對象的操作分開。
Ⅶ 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 中的淺拷貝是什麼效果
首先必須知道Java拷貝的用途:Java克隆是為了得到一個對象,這個對象與克隆前的對象完全一樣,唯一不同就是它們所處的內存地址不相同。對於java中的一切對象(除了基本的數據結構int、float、string等之外)在進行賦值,方法傳遞的時候,都是一個內存地址的同一個對象! 所謂淺拷貝一般就是就是直接調用對象的clone()方法,這樣的拷貝,對於這個對象中的基本數據類型(int、string、float等)的屬性,是可以得到完全的拷貝,但是對於這個對象裡面的非基本數據類型(對象、集合等)的某些屬性,實際上並沒有進行克隆,而只是進行一個賦值操作而已,也就是說克隆出來的對象與原對象有一部分內容的內存地址是相同的,這在某些情況下會造成出錯! 由此提出了深拷貝的概念,即覆寫clone()方法,遍歷對象中的每一個屬性,採取合適的方式進行克隆即可。例如對於對象中的集合,可以遍歷集合,然後構造一個新的集合,重新存儲一遍... 更過關於Java克隆的問題詳見Blog。
Ⅸ java 通過newinstance 反射技術進行淺復制
你想調用、想拷貝?可returnCopy方法內應該還沒寫完整。。。。。
Ⅹ Java中數組的clone方法為什麼是淺復制
這個問題應該去看下API Object.clone(); 可以認為clone方法復制出來的數組 裡面的元素 還是使用原數組的元素 並沒有生成新的元素。
protected Object clone()
throws CloneNotSupportedException
The method clone for class Object performs a specific cloning operation. First, if the class of this object does not implement the interface Cloneable, then a CloneNotSupportedException is thrown. Note that all arrays are considered to implement the interface Cloneable and that the return type of the clone method of an array type T[] is T[] where T is any reference or primitive type. Otherwise, this method creates a new instance of the class of this object and initializes all its fields with exactly the contents of the corresponding fields of this object, as if by assignment; the contents of the fields are not themselves cloned. Thus, this method performs a "shallow " of this object, not a "deep " operation.