其實所有的java對象都可以具備克隆能力,只是因為在基礎類Object中被設定成了一個保留方法(protected),要想真正擁有克隆的能力,就需要實現Cloneable接口,重寫clone方法。通過克隆方法得到的對象得到的是一個本地的副本。

代碼示例:

class User implements Cloneable{

  int age;

  public User(int age){

    //用this關鍵字不至于類成員變量與形參混淆

    this.age=age;

  }


  //這里可加@Override也可不加,加了會自動提示是否正確

  @Override

  public Object clone{

    Object o=null;

    try{

      o=super.clone();

    }catch(CloneNotSupportedException e){

      e.printStackTrace();

    }

  }

  public String toString(){

    return Integer.toString(this.age);

  }

}


public class Test{

  //(1)main中只能調用靜態方法(2)修改的是傳入的User對象

  static User g(User u){

    u.age++;

    return u;

  }


  //在本地產生了一個User對象副本

  static User f(User u){

    u=(User)u.clone();

    u.age++;

    return u;

  }


  public static void main(String[] args){

    User u=new User(23);

    User u2=g(u);

    if(u==u2)

      System.out.println("u==u2");

    else

      System.out.println("u!=u2");

    //下面會自動調用User對象的toString()方法

    System.out.println("u.age:"+u);

    System.out.println("u2.age:"+u2);


    User u3=new User(23);

    User u4=f(u3);

    if(u3==u4)

      System.out.println("u3==u4");

    else

      System.out.println("u3!=u4");

    System.out.println("u3.age:"+u3);

    System.out.println("u4.age:"+u4);

  }

}


//基本知識:要想讓對象具有clone方法,只要實現Cloneable接口,重寫clone方法即可,但是有兩個需要注意的點:(1)調用super.clone()方法(2)定義為public公共方法


/**--注意--**/

以上代碼都是在文本編輯器中寫的,可能會有些許紕漏