java對象的復制
① java 對象 克隆
這是裡面的一段(非完整的例子):
public class Snake implements Cloneable {
...........................
public Object clone() {
Object o = null;
try {
o = super.clone();
} catch (CloneNotSupportedException e) {}
return o;
}
書上一段給你看看,希望有幫助把。。
當製作實例變數的一個引用時,原始實例變數和副本實力變數在內存中引用的均是同一個存儲空間,這就意味著但對其中一個實例變數操作時就會影響到這個對象的副本。例如下面的程序代碼。在執行時將會看到所畫的兩條線重合在一起,都是改變後的LineFigure1。
LineFigure lineFigure1 = new LineFigure();
LineFigure lineFigure2 = lineFigure1;
lineFigure1.draw(g);
…code for changing lineFigure1
lineFigure2.draw(g);
如果想讓LineFigure2成為一個新的對象,就要用到Clone( )方法。Clone的後對象和原對象的存儲空間不同,改變其中一個並不會對另一個產生任何影響。例如下面代碼所示:
…………….
LineFigure2 = lineFigure1.clone();
…………….
如果LineFigure2中沒有對其他對象的引用,事情就到此結束了,但LineFigure類中的實例變數StartPoint和EndPoint都是一個對象,即使簡單地實現了對LineFigure1地Clone,可LineFigure1和LineFigure2的StartPoint和EndPoint實例變數引用的是同一個變數,要想完全的實現將LineFigure2和LineFigure1分離開,就要實現Cloneable介面,並重寫Clone方法。Cloneable介面是Java提供的少數幾個標簽化介面之一。平常所說的標簽化介面就是不提供任何方法的介面。在圖形白板程序中,也用到了Cloneable介面,例如LineFigure類中的代碼:
public class LineFigure extends Figure implements Cloneable{
public Object clone(){
LineFigure lineFigure = new LineFigure();
lineFigure.startPoint = (Point)startPoint.clone();
lineFigure.endPoint = (Point)endPoint.clone();
lineFigure.firstDraw = firstDraw;
return lineFigure;
}
………………..
}
這樣一來,LineFigure1和LineFigure2所引用的對象就沒有任何的重合。對其中任何一個進行修改而不影響另一個的應用。
② 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怎麼樣構造函數復制一個對象
一、用Object 本身的復制對象的方法, clone()。對象可克隆的類必須實現Cloneable介面,並且clone方法是淺克隆。
二、類實現Serializable,用ObjectOutputStream、ObjectInputStream 來復制對象。
對象克隆有點復雜,尤其是第一種。
關於這個問題你可以搜索:
JAVA深復制(深克隆)與淺復制(淺克隆)
這篇文章看看。
④ Java中請問將一個對象賦值給另一個同類對象,這兩個對象是否指向同一堆內存
是的。
對象是引用類型的,所以如果把一個對象賦值給另一個變數,它實際上只是把內存地址賦值了。也就是說,如果對象都是同一地址,那麼改變該地址的值,另外一個同地址的對象也會改變。
首先可以使用構造器的參數區別開兩個對象,如果要直接賦值而不互相影響,那麼可以使用clone(淺復制、深復制包含內部引用等)方法如Person newPerson=(Person)oldPerson.clone();這樣新舊對象是2個對象而不是共用一個地址的2個對象。
堆和棧
內存管理在Java語言中是JVM自動操作的,當JVM發現某些對象不再需要的時候,就會對該對象佔用的內存進行重分配(釋放)操作,而且使得分配出來的內存能夠提供給所需要的對象。
在一些編程語言裡面,內存管理是一個程序的職責,但是書寫過C++的程序員很清楚,如果該程序需要自己來書寫很有可能引起很嚴重的錯誤或者說不可預料的程序行為,最終大部分開發時間都花在了調試這種程序以及修復相關錯誤上。
以上內容參考:網路-java內存模型
⑤ Java 如何復制對象
可以使用clone來實現,clone用於為引用類型的復制
1.使用clone方法的類必須先實現Cloneable介面,不然clone方法會直接返回CloneNotSupportedException不支持克隆的異常
2、實現Cloneable介面的類應該使用公共方法重寫 Object.clone(它是受保護的)。某個對象實現了此介面就克隆它是不可能的。即使 clone 方法是反射性調用的,也無法保證它將獲得成功。
3、在Java.lang.Object類中克隆方法是這么定義的:
protected Object clone()
throws CloneNotSupportedException
創建並返回此對象的一個副本。表明是一個受保護的方法,同一個包中可見。
⑥ java對象深層復制有什麼好處
你說的是不是深拷貝和淺拷貝,深拷貝是把一個原變數的值賦給新的變數,而淺拷貝只是把原變數在計算機的內存地址賦給新的變數,所以深拷貝之後可以獨立操作原變數和新變數,互不幹擾,而淺拷貝只要新變數或者原變數的值改變了,另一個也改變
⑦ java中對象的克隆疑問
Object o1=new Object();
System.out.println(o1.hasCode());//列印o1的內存地址。
Object o2=new Object();
System.out.println(o2.hasCode());//列印o2的內存地址。
可見o1和o2擁有不同的內存數據,如果你讓o2=o1,那o1和o2的地址就一樣了,就是一個對象了,怎麼還叫克隆?
老祖宗Object類的clone方法是將一個對象的數據原封不動的復制到另一個對象中去,比如o2=o1.clone();就將o1的數據復制了一份考貝到了另一塊內存中,所以o2與o1地址不一樣但數據相同。
你這里的super.clone();就是調用的Object類的clone()方法,調用Object的方法不就是省得你自己寫了嗎。
你可能還會問Object既然有clone()方法,而所有的類都是Object類的子類,那所有的類不都有clone()方法嗎,干什麼還自己寫?Object類雖然有clone()方法,但是訪問控制符是protected而不是public,於是別的類不可見,所以你需要重寫它:
@Override
public Object clone(){
Object obj=null;
try {
obj= super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return obj;
}
而且你需要將你的類實現cloneable介面,這是必須的。
⑧ 如何克隆Java對象
Java中的對象涉及使用引用類型,沒有直接的方法可將一個對象的內容復制到一個新對象中。將一個引用分配給另一個引用只會給相同對象建立另一個引用。因此,Java對所有引用類型使用一個特殊的clone()方法,為對象復制自身提供一個標準的機制。以下是你需要了解和克隆Java對象有關的細節。為何建立一個本地拷貝?給一個對象建立本地拷貝的原因很可能是由於你計劃修改該對象,並且你不想修改方法調用者的對象。如果你確定你需要一個本地拷貝,你可以使用Object類的clone()方法來執行這項操作。clone()方法被定義為受保護方法,但你必須在你希望克隆的所有子類中重新公開定義它。例如,標准庫類ArrayList忽略clone(),但你可以這樣為ArrayList調用clone()方法:import java.util.*;class MyInt {private int i;public MyInt(int ii) { i = ii; }public void increment() { i++; }public String toString() {return Integer.toString(i);}}public class Test {public static void main(String[] args) {ArrayList al = new ArrayList();for(int i = 0; i < 10; i++ )al.add(new MyInt(i));ArrayList al1 = (ArrayList)al.clone();// Increment all al1』s elements:for(Iterator e = al1.iterator(); e.hasNext(); ) ((MyInt)e.next()).increment();}}clone()方法生成一個Object,它必須重新轉變為適當的類型。這個例子說明ArrayList的clone()方法如何不能自動克隆ArrayList包含的每一個對象?原有ArrayList和克隆後的ArrayList是相同對象的別名。這種情況通常叫做淺拷貝,因為它僅僅復制一個對象的「表面」部分。實際的對象由這個「表面」,引用指向的所有對象,以及那些對象指向的所有對象等構成。這往往被稱作「對象網路」。下一頁>>
⑨ java對象值的
讓B成為A的子類,使用JAVA的反射機制,自己寫一個子類拷貝父類的屬性的函數,這樣無論父類有幾個屬性都可以不用修改代碼了。
參考一下:
http://jeffen2006.iteye.com/blog/319672
⑩ java如何深度一個object
方法一:把對象序列化之後再反序列化,之後得到的對象就是深度克隆的對象;
方法二:自己重寫方法,不過有點麻煩。