java对象复制问题,如何能拷贝

一个对象的类的clone()是protected的 ,如何拷贝这个对象 ,类不可修改

2个回答

对象的拷贝目前我所能知道的只是一个属性一个属性的set比如

 A a =  new A();
 A b = new A();
 b.setXXX(a.getXXX)

不能用a=b这种方法,因为这样还是用同一个对象
一个一个的set才是两个相同对象

sinat_38808221
sinat_38808221 这样太复杂了
接近 3 年之前 回复

public class Person implements Cloneable{
/** 姓名 **/
private String name;

/** 电子邮件 **/
private Email email;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Email getEmail() {
    return email;
}

public void setEmail(Email email) {
    this.email = email;
}

public Person(String name,Email email){
    this.name  = name;
    this.email = email;
}

public Person(String name){
    this.name = name;
}

protected Person clone() {
    Person person = null;
    try {
        person = (Person) super.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }

    return person;
}

}

public class Client {
public static void main(String[] args) {
//写封邮件
Email email = new Email("请参加会议","请与今天12:30到二会议室参加会议...");

    Person person1 =  new Person("张三",email);

    Person person2 =  person1.clone();
    person2.setName("李四");
    Person person3 =  person1.clone();
    person3.setName("王五");

    System.out.println(person1.getName() + "的邮件内容是:" + person1.getEmail().getContent());
    System.out.println(person2.getName() + "的邮件内容是:" + person2.getEmail().getContent());
    System.out.println(person3.getName() + "的邮件内容是:" + person3.getEmail().getContent());
}

}

Output:
张三的邮件内容是:请与今天12:30到二会议室参加会议...
李四的邮件内容是:请与今天12:30到二会议室参加会议...
王五的邮件内容是:请与今天12:30到二会议室参加会议...

chenhande1990chenhan
-无-怨-无-悔- 回复sinat_38808221: 不客气的
接近 3 年之前 回复
sinat_38808221
sinat_38808221 好的,谢谢了啊 ^_^
接近 3 年之前 回复
chenhande1990chenhan
-无-怨-无-悔- 回复sinat_38808221: 对的 主要是只有在一个包才能调用clone方法 你在PersonFactory里面将方法都写成public对perso类里的方法进行封装 那么外面包就可以通过PersonFactory访问Person的方法了
接近 3 年之前 回复
sinat_38808221
sinat_38808221 回复-无-怨-无-悔-: 就必须在Person所在的包内操作了是吗
接近 3 年之前 回复
chenhande1990chenhan
-无-怨-无-悔- 回复sinat_38808221: 在相同包下在写一个类PersonFactory对Person需要的方法进行再次封装,比如这个类可以有生成person对象,person的clone等等
接近 3 年之前 回复
sinat_38808221
sinat_38808221 如果Person类就像你上面写的那样,不能做任何改动呢,有没有别的办法
接近 3 年之前 回复
chenhande1990chenhan
-无-怨-无-悔- 回复sinat_38808221: 加一个public Person fun(){ return this.clone();}
接近 3 年之前 回复
chenhande1990chenhan
-无-怨-无-悔- 回复sinat_38808221: 说错了
接近 3 年之前 回复
chenhande1990chenhan
-无-怨-无-悔- 回复sinat_38808221: 这个与包没关系的 你可以把main方法卸载Person里面
接近 3 年之前 回复
sinat_38808221
sinat_38808221 要是你的Person和Client不在一个包内呢?
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问