由于java数据类型中,当引用类型,引用对象的值发生变化时,直接修改了原始地址的值(如,在方法中修改了引用对象的值);由于某些原因,我们不希望原始地址的值发生变化。对象的克隆也就产生了。下面我们谈谈有关对象的克隆。
为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。克隆一个对象,主要包括以下步骤:
1. 在派生类中覆盖基类的clone()方法,并声明为public。(为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object中的clone()识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。
)
2. 在派生类的clone()方法中,调用super.clone()。
3. 在派生类中实现Cloneable接口。
如下代码所示,我们可以看出克隆的用法:
public class Testclone {
/** * @param args */ public static void main(String[] args) { Student stu1 = new Student("one",1); Student stu3 = (Student)stu1.clone(); //Student stu2=stu1; //stu2.name="tow"; //stu2.age=2; //System.out.println("name="+stu2.name+",age="+stu2.age); //System.out.println("name="+stu1.name+",age="+stu1.age); //以上输出:name=tow,age=2 //以上输出:name=tow,age=2 stu3.name="three"; stu3.age=3; System.out.println("name="+stu3.name+",age="+stu3.age); System.out.println("name="+stu1.name+",age="+stu1.age); //以上输出:name=three,age=3 //name=one,age=1 } }
class Student implements Cloneable { String name; int age; public Student(String names,int ages) { this.name=names; this.age=ages; } public Object clone() { Object o = null; try { o = super.clone(); } catch(CloneNotSupportedException ex) { System.out.println(ex.getMessage()); } return o; } }
|
由上面的例子我们可以看出,通过对象的克隆,并没有改变引用对象的值。这里要补充说明一点,String是引用类型,它的值为什么也没有改变呢?这里强调一下,String是一种特殊的引用类型,我们可以称之为常量字符串。在栈内存中,实际上是得到了一份拷贝。
对于对象的参数为一个对象类型时,该参数代表了该对象的引用。如何克隆,保证其原引用对象的值不变呢?如下例如下,我不作过多解释,大家可以体会其中的道理:
public class Testclone {
/** * @param args */ public static void main(String[] args) { Professor p1 = new Professor("teacher1",55); Student stu1 = new Student("one",1,p1); Student stu3 = (Student)stu1.clone();
stu3.name="three"; stu3.age=3; stu3.p.name="lisi"; stu3.p.age=30; System.out.println("name="+stu1.name+",age="+stu1.age); System.out.println("name="+stu1.p.name+",age="+stu1.p.age);
}
} class Professor implements Cloneable { String name; int age; public Professor(String names,int ages) { this.name=names; this.age=ages; } public Object clone() { Object o = null; try { o = super.clone(); } catch(CloneNotSupportedException ex) { System.out.println(ex.getMessage()); } return o; } }
class Student implements Cloneable { String name; int age; Professor p; public Student(String names,int ages,Professor p) { this.name=names; this.age=ages; this.p = p; } public Object clone() { Student o = null; try { o = (Student)super.clone(); } catch(CloneNotSupportedException ex) { System.out.println(ex.getMessage()); } o.p=(Professor)p.clone(); return o; } } 输出结果为: name=one,age=1 name=teacher1,age=55
|