2 java faep java_faep 于 2017.01.04 16:53 提问

Java克隆对象失败,里面的对象属性没有克隆成功

想克隆一个输入流对象
类:
class CloneTest implements Cloneable{

    public InputStream inputStream = null;

    public CloneTest(InputStream inputStream){
        this.inputStream = inputStream;
    }

    public Object clone() throws CloneNotSupportedException {
        CloneTest cloneTest = (CloneTest)super.clone();
        return cloneTest;
    }

    public InputStream getInputStream() {
        return inputStream;
    }

    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }

}

调用的代码:
CloneTest ct = new CloneTest(inputStream);
CloneTest ct2 = (CloneTest)ct.clone();
InputStream inputStream2 = ct2.getInputStream();

这里得到的inputStream2和传进去的参数inputStream还是同一个对象,如何克隆呢?

4个回答

zhaoruixiang1111
zhaoruixiang1111   2017.01.04 20:44
已采纳

斗胆来回答, 你的clone方法中只是简单的调用了CloneTest的父类的clone方法,
这里jvm并不会自动复制你的InputStream属性.如果你需要克隆后的对象和克隆
前的对象引用不同的InputStream对象,那么你需要自己编码复制该InputStream
对象.
就像下面这样

 public Object clone() throws CloneNotSupportedException {
        CloneTest cloneTest = (CloneTest) super.clone(); 

        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        byte[] buffer = new byte[1024];  
        int len;  
        try {
            while ((len = inputStream.read(buffer)) > -1 ) {  
                baos.write(buffer, 0, len);  
            }
            baos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }                
        InputStream is = new ByteArrayInputStream(baos.toByteArray());
        cloneTest.setInputStream(is);
        return cloneTest;
    }
bdmh
bdmh   Ds   Rxr 2017.01.04 16:59
oyljerry
oyljerry   Ds   Rxr 2017.01.04 17:22

你还只做了clone,目前对象是一样的,你还需要对ct2用setInputStream进行修改,这样才会两个对象的属性不一样

u014266877
u014266877   2017.01.04 18:07

因为 CloneTest 只创建了一次,只有一个实例,你要克肯定要创建两个实例,只能进行克隆啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
java克隆中String的特殊性
java克隆中String的特殊性 最近在写对象的 clone 时遇到有关 String 的一些疑问,希望以下这篇网友的总结也能帮助各位吃瓜群众。 本文摘抄自:http://blog.csdn.net/naivesoft/article/details/6774550 之前仔细研究过Java中克隆的相关知识,http://blog.csdn.net/naivesoft/articl
java中对象的克隆
克隆是完全复制另一个物体,在java中,意味着创建一个和原对象有相似状态的对象。clone()方法就提供了这个功能,在这篇文章中,我们将探索java 克隆的一些最重要的方面。这篇文章是mini guides的一个部分 详细解释克隆 克隆是创建原对象的一个复制,字典上的意思是“精确的复制”。默认情况下,java的克隆是一个字段一个字段的复制。例如:对象类调用的clone()方法,对将要复制的类的
java对象克隆简单实现(可多级克隆)
1.为什么需要克隆 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在Java语言中,用简单的赋值语句是不能满足这种需求的,要满足这种需求有很多途径2.工具类BeanUtil public abst
通过反射克隆对象,对象复制(克隆)工具类
最近做的项目中,经常会遇到用视图来操作数据库的,但是页面需要的则是某个实体对象,在controller层查出list 还要把将view对象转化成entity对象。需要写一大堆的get和set方法,而且如果实体增删字段的话,还需要把转化代码再修改一下,让人头疼。        当我需要操作一个实体对象完成两件不同的事情,这2个方法中会修改实体对象中的属性,第一个方法调用后,再调用第二个方法时,会受
Java中Object类的clone()(克隆)方法
Java提供了一个projected修饰的clone()方法,该方法用来实现对象的“自我克隆”,即得到当前对象的一个副本,并且两个对象之间完全隔离。需要注意的是,由于该方法使用projected修饰,因此该方法只能被子类重写或者调用。 自定义类实现克隆的步骤如下: 1、首先自定义类需要实现Cloneable接口,该接口只是一个标记性接口(接口中没有定义任何方法),表明实现该接口的类可以实现“自
Java属性克隆的几种方法
在实际开发中经常遇到属性克隆的问题,比如在表现层提交的Request DTO,可能需要在控制层被映射成多个Java Bean,再传递到逻辑层来进行相应的业务处理,那么如何才能简单而又快速的完成属性克隆呢?        对于仅仅包含简单属性的Java Bean来说,Apache Commons里的BeanUtils 是个不错的选择,不过前提是对应属性必须具备相同的属性名。但是对于复杂属性来说,
java之克隆一个对象(此对象包含list引用)-clone()
在java克隆的时候,所要克隆的对象包含比较复杂的数据结构如:list集合等一些复杂的引用的时候,该怎么克隆。 深克隆,浅克隆的实现和理解。
clone常见的三种方式
在JAVA中克隆一个对象常见的有三种形式 1.通过自己写一个克隆方法里面 new 一个同样的对象来进行 get、set 依次赋值实现深度克隆(很繁琐且易出错); 2.通过实现 Cloneable 接口并重写 Object 类的 clone() 方法(分为深浅两种方式); 3.通过实现 Serializable 接口并用对象的序列化和反序列化来实现真正的深度克隆;第一种方法并没有什么卵用Clon
java 实现对象克隆
1、为什么要克隆在java中,复制一个变量很容易int a = 5; int b = a; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但是如果我们需要复制一个对象,使用变量的”=”符号复制就不正确了,除了在函数传值的时候是”引用传递”,在任何用”=”向对象变量赋值的时候都是”引用传递”。
PHP对象赋值与克隆
在php5 的对象编程经常提到的一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。下面通过一些例子来说明。php的引用是别名,就是两个不同的变量名字指向相同的内容。在php5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的