1、浅拷贝(同一个引用):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
2、深拷贝(新引用):被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
3、浅拷贝:
class Student {
private int number;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
public class Test {
public static void main(String args[]) {
Student stu1 = new Student();
stu1.setNumber(12345);
Student stu2 = stu1;
System.out.println("学生1:" + stu1.getNumber());
System.out.println("学生2:" + stu2.getNumber());
}
}
4、深拷贝:
实现方式:
1. 被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常) 该接口为标记接口(不含任何方法)
2. 覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象,(native为本地方法)
Java的clone()方法
⑴clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:
①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象
②对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样
③如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。
⑵Java中对象的克隆
①为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。
②在派生类中覆盖基类的clone()方法,并声明为public。
③在派生类的clone()方法中,调用super.clone()。
④在派生类中实现Cloneable接口。
class Student implementsCloneable{private intnumber;public intgetNumber() {returnnumber;
}public void setNumber(intnumber) {this.number =number;
}
@OverridepublicObject clone() {
Student stu= null;try{
stu= (Student)super.clone();
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}returnstu;
}
}public classTest {public static voidmain(String args[]) {
Student stu1= newStudent();
stu1.setNumber(12345);
Student stu2=(Student)stu1.clone();
System.out.println("学生1:" +stu1.getNumber());
System.out.println("学生2:" +stu2.getNumber());
stu2.setNumber(54321);
System.out.println("学生1:" +stu1.getNumber());
System.out.println("学生2:" +stu2.getNumber());
}
}
5、Java示例:
publicObject clone() {
Date d= null;try{
d= (Date)super.clone();if (cdate != null) {
d.cdate=(BaseCalendar.Date) cdate.clone();
}
}catch (CloneNotSupportedException e) {} //Won't happen
returnd;
}