日期:2014-05-20  浏览次数:20833 次

关于怎么拷贝一个对象。
请教一个问题:
public class Ja(){
public int i ;
public void setI( int i ){
this.i = i;
}
public int getI( ){
return i;
}
}

public class Main(){
public static void main(){
Ja ja1 = new Ja();
ja1.setI(9);

Ja ja2 = new Ja();
ja2 = ja1;

// 我试过了,ja2虽然是 new 出来的,但是却是引用的 ja1.
请问怎么复制一份 ja1,而且不是引用呢?
}
}

------解决方案--------------------
浅拷贝:调用Object的clone()方法
深拷贝:重写(覆盖)clone()方法
------解决方案--------------------
Java code
public class Test {
  public static void main(String args[]) {
    Ja ja1 = new Ja();
    ja1.setI(9);
    Ja ja2 = ja1.clone(); // 调用clone方法实现复制
  }
}

class Ja {
  public int i;

  public void setI(int i) {
    this.i = i;
  }

  public int getI() {
    return i;
  }

  @Override
  public Ja clone() { // 自定义的clone方法
    Ja a = new Ja();
    a.setI(this.getI());
    return a;
  }
}

------解决方案--------------------
浅克隆:因为楼主类中没有对象引用,所能用Object的clone()方法 ,你的类应该实现Cloneable接口。
Java code

class Ja implements Cloneable {
    public int i;

    public void setI(int i) {
        this.i = i;
    }

    public int getI() {
        return i;
    }

    @Override
    public Object clone() throws CloneNotSupportedException { // 自定义的clone方法
        return super.clone();
    }
}
public class Test {
          public static void main(String args[]) {
            Ja ja1 = new Ja();
            ja1.setI(10);
            Ja ja2 = null;
            try {
                ja2 = (Ja)ja1.clone();
            } catch (CloneNotSupportedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } // 调用clone方法实现复制
            System.out.println(ja2.getI());
            
          }

}

------解决方案--------------------
调用超类 
也就是Cloneable 接口