今天遇到这样一个问题

ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {

Object[] obj=new Object[3];

for(int i=0;i<boj.length;i++){

obj[i]=form.getObject();

obj[i].setP=i;

}

}

最后obj[0].getP、obj[1].getP、obj[2].getP结果都是3,困扰了我半天,最后终于发现原有所在。

Java中有以下语句 Object a=new A(); Object b=a; 这样一来a和b都指向同一个对象,并没有new一个新对象。通过a或b都可以改变对象。

解决问题的把法就是在循环里new一个对象,然后设置新对象的属性用ActionForm中的属性,对象属性若有几十个属性,一一设置很麻烦,幸好java.lang.Object对象有个clone方法,不过要实现java.lang.Cloneable接口。该接口没有任何方法。

简单的例子:浅克隆(对象的属性非用户自定义类型)

public class Person implements java.lang.Cloneable{ 
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
String string=this.name+"-"+this.age;
return string;
}
public Person clone() throws CloneNotSupportedException{
return (Person)super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException{
Person p1=new Person("aName",10);
Person p2=p1.clone();
p2.setName("leonard");
p2.setAge(100);
System.out.println(p1);
System.out.println(p2);
}
}

深度克隆(对象属性里有用户定义类型)结合上面的Person类

public class Family implements java.lang.Cloneable{
String name;
Person person;
public Family() {
   // TODO Auto-generated constructor stub
}
    public Family(String name,Person person){
    this.name=name;
    this.person=person;
    }
    public Family clone() throws CloneNotSupportedException{
    Family family=(Family)super.clone();
    family.person=this.person.clone();//关键的一步
   return family;
    }
public String getName() {
   return name;
}
public void setName(String name) {
   this.name = name;
}
public Person getPerson() {
   return person;
}
public void setPerson(Person person) {
   this.person = person;
}
}
测试:

public static void main(String[] args) throws CloneNotSupportedException {
   Person person=new Person("",29);
   Family family=new Family();
   family.setName("");
   family.setPerson(person);
  
   Family family2=(Family)family.clone();
   family2.setName("");
   family2.getPerson().setName("");
   family2.getPerson().setAge(100);
  
   System.out.println("a姓氏:"+family.getName()+" 后裔:"+family.getPerson());
   System.out.println("a姓氏:"+family2.getName()+" 后裔:"+family2.getPerson());

}

深度克隆的前提:Family和Person都必须实现java.lang.Cloneable并重写Object的clone方法。

Family对象在调用super.clone()后,family1和family2是两个不同的对象,但是他们的Person属性确是指向同一个person,所以必须有下一步family.person=this.person.clone()来克隆一个Person对象,这样一来两个Family对象完全独立了。以此类推。
posted on 2010-07-27 15:51  leonard2010  阅读(1436)  评论(0编辑  收藏  举报