㈠ 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 對象 克隆
這是裡面的一段(非完整的例子):
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中,復制一個對象,有什麼好的方法
使用Java的反射機制實現:為了能更好的區分,寫成了兩個類,可以運行下面的代碼看看效果
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test {
public static void main(String[] args) throws Exception {
Customer1 c1 = new Customer1();
c1.setName("c1");
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
c1.setList(list);
Map<String,String> map = new HashMap<String, String>();
map.put("map1", "map1");
map.put("map2", "map2");
c1.setMap(map);
Customer2 c2 = new Customer2();
//
Class c = c1.getClass();
Class class2 = c2.getClass();
Field fields[] = c.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getMethodName = "get" + firstLetter + fieldName.substring(1);
String setMethodName = "set" + firstLetter + fieldName.substring(1);
Method getMethod = c.getMethod(getMethodName, new Class[] {});
Method setMethod = class2.getMethod(setMethodName,
new Class[] { field.getType() });
Object value = getMethod.invoke(c1, new Object[] {});
setMethod.invoke(c2, new Object[] { value });
}
System.out.println(c2.getName());
System.out.println(c2.getList());
System.out.println(c2.getMap());
}
}
class Customer1 {
private String name;
private List<String> list;
private Map<String, String> map;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
class Customer2 {
private String name;
private List<String> list;
private Map<String, String> map;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
㈣ java 代碼實現對象的拷貝
package com.teven.comefromnet;
/**
* Name:C.java
* Founction:
* Created:2011-9-15
* @author :teven
*/
public class CloneTest {
static class A implements Cloneable{
int i=1;
@Override
protected A clone() throws CloneNotSupportedException {
return (A)super.clone();
}
}
static class B extends A{
int j=2;
@Override
protected B clone() throws CloneNotSupportedException {
return (B)super.clone();
}
}
static class C extends B{
int k=3;
@Override
protected C clone() throws CloneNotSupportedException {
return (C)super.clone();
}
}
public static void main(String[] args) throws CloneNotSupportedException {
A a = new CloneTest.A();
A aa = (A) a.clone();
System.out.println("before clone a.i = "+ a.i+">> after clone aa.i=" +aa.i);
B b = new CloneTest.B();
B bb= (B) b.clone();
System.out.println("before clone b.j = "+ b.j+">> after clone bb.j=" +bb.j);
C c = new CloneTest.C();
C cc= (C) c.clone();
System.out.println("before clone c.k = "+ c.k+">> after clone cc.k=" +cc.k);
}
}
㈤ java 拷貝對象工具類有哪些
其他普通類::從beanInfo【每一個對象都有一個緩存的bean信息,包含屬性欄位等】取出name,然後把sourceClass和targetClass逐個拷貝
㈥ Java 如何復制對象
可以使用clone來實現,clone用於為引用類型的復制
1.使用clone方法的類必須先實現Cloneable介面,不然clone方法會直接返回CloneNotSupportedException不支持克隆的異常
2、實現Cloneable介面的類應該使用公共方法重寫 Object.clone(它是受保護的)。某個對象實現了此介面就克隆它是不可能的。即使 clone 方法是反射性調用的,也無法保證它將獲得成功。
3、在Java.lang.Object類中克隆方法是這么定義的:
protected Object clone()
throws CloneNotSupportedException
創建並返回此對象的一個副本。表明是一個受保護的方法,同一個包中可見。
㈦ 如何Java復制父類對象的數據到子類對象中
可以做到。首先數組的定義就是一組相同數據類型的集合,而繼承父類的子類作為一種引用數據類型,他造出的對象也是可以保存在數組當中的。但是基本上沒人會這樣做,但實現我認為是能夠的,你想想,String作為一種引用數據類型,他造出的字元串都可以保存在數組中,子類為什麼不能呢?
-
㈧ java如何深度一個object
java本身好像沒有提供這個方法的吧,只有你自己重新創建一個對象,然後賦值給這個對象。
iamge的復制可以用BufferedImage的方法:
public WritableRaster Data(WritableRaster outRaster)計算 BufferedImage 的一個任意矩形區域,並將其復制到指定的 WritableRaster。要計算的區域由指定 WritableRaster 的邊界確定。指定 WritableRaster 必須具有與此圖像兼容的 SampleModel。如果 outRaster 為 null,則創建一個合適的 WritableRaster。
不過還有一個簡單的辦法,就是創建一個一樣大小和一樣類型的BufferedImage,然後把要復制的圖畫上去,這兩個圖片就是一樣的了。