‘壹’ 如何克隆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中,复制一个对象,有什么好的方法
使用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 已知一个对象的引用,如何复制一个对象呢
obj.clone();2楼那个只是两个引用指向一个对象!
‘肆’ java怎么样构造函数复制一个对象
一、用Object 本身的复制对象的方法, clone()。对象可克隆的类必须实现Cloneable接口,并且clone方法是浅克隆。
二、类实现Serializable,用ObjectOutputStream、ObjectInputStream 来复制对象。
对象克隆有点复杂,尤其是第一种。
关于这个问题你可以搜索:
JAVA深复制(深克隆)与浅复制(浅克隆)
这篇文章看看。
‘伍’ java对象复制的问题
1.
被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常)
该接口为标记接口(不含任何方法)
2.
覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象,(native为本地方法)
‘陆’ Java 如何复制对象
可以使用clone来实现,clone用于为引用类型的复制
1.使用clone方法的类必须先实现Cloneable接口,不然clone方法会直接返回CloneNotSupportedException不支持克隆的异常
2、实现Cloneable接口的类应该使用公共方法重写 Object.clone(它是受保护的)。某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。
3、在Java.lang.Object类中克隆方法是这么定义的:
protected Object clone()
throws CloneNotSupportedException
创建并返回此对象的一个副本。表明是一个受保护的方法,同一个包中可见。
‘柒’ 如何复制一个java对象
/**
*复制对象
*
*@paramsrcObj
*@return
*/
publicstaticObjectdepthClone(ObjectsrcObj){
if(srcObj==null){
returnnull;
}
ObjectcloneObj=null;
ByteArrayOutputStreamout=null;
ObjectOutputStreamoo=null;
ByteArrayInputStreamin=null;
ObjectInputStreamoi=null;
try{
out=newByteArrayOutputStream();
oo=newObjectOutputStream(out);
oo.writeObject(srcObj);
in=newByteArrayInputStream(out.toByteArray());
oi=newObjectInputStream(in);
cloneObj=oi.readObject();
}catch(IOExceptione){
e.printStackTrace();
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}finally{
if(out!=null){
try{
out.close();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
if(oo!=null){
try{
oo.close();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
if(in!=null){
try{
in.close();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
if(oi!=null){
try{
oi.close();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
}
returncloneObj;
}
‘捌’ 关于java克隆对象
--在使用clone方法时,对于每一个类,都需要做如下判断:
1--默认的clone方法是否能满足要求
2--默认的clone方法是否能通过调用可变子对象的clone方法修补
3--是否不应该使用clone
----如选择1和2,就必须实现Cloneable接口,使用public重定义clone方法
意思就是,你如果想用clone方法,首先要考虑Object的clone能不能满足你的需求,如果可以,那好,直接调用,反之,你就得必须在需要使用clone方法的类中实现Cloneable接口,自己写一个Clone规则。
‘玖’ java中clone出的对象怎么用
首先必须实现接口,publicinterfaceCloneable此类实现了Cloneable接口,以指示Object.clone()方法可以合法地对该类实例进行按字段复制。如果在没有实现Cloneable接口的实例上调用Object的clone方法,则会导致抛出CloneNotSupportedException异常。按照惯例,实现此接口的类应该使用公共方法重写Object.clone(它是受保护的)。请参阅Object.clone(),以获得有关重写此方法的详细信息。==》protectedObjectclone()注意,此接口不包含clone方法。因此,因为某个对象实现了此接口就克隆它是不可能的。即使clone方法是反射性调用的,也无法保证它将获得成功。{publicDated=newDate();@OverridepublicBoxclone(){Boxcloned=(Box)super.clone();cloned.d=(Date)d.clone();return(Box)super.clone();}publicstaticvoidmain(String[]args)throwsException{Boxb=newBox();Boxb2=(Box)b.clone();System.out.println(b.d==b2.d);}}测试后直接返回的话结果是地址相等。你在克隆后用了set方法重新操作了,肯定是不一样的。。。。!!!3,注释起来后结果是改变了的,你会不会是没编译保存。你们老师是说的对的你好,当然知道你说的那样。我正是因为三个的试过了,所以最后没改回去,那不正是你第二个问题嘛。。。如果是深克隆就是FALSE不是深克隆就返回TRUE啊。
‘拾’ java如何深度一个object
java本身好像没有提供这个方法的吧,只有你自己重新创建一个对象,然后赋值给这个对象。
iamge的复制可以用BufferedImage的方法:
public WritableRaster Data(WritableRaster outRaster)计算 BufferedImage 的一个任意矩形区域,并将其复制到指定的 WritableRaster。要计算的区域由指定 WritableRaster 的边界确定。指定 WritableRaster 必须具有与此图像兼容的 SampleModel。如果 outRaster 为 null,则创建一个合适的 WritableRaster。
不过还有一个简单的办法,就是创建一个一样大小和一样类型的BufferedImage,然后把要复制的图画上去,这两个图片就是一样的了。