java中的拷贝方法
- 格式:doc
- 大小:12.87 KB
- 文档页数:8
java中的拷贝方法
Java 中的拷贝方法是一个非常重要的概念,在开发和设计 Java 程序时经常会用到。拷贝是指将一个对象的所有属性值复制到另一个对象中,这样许多重要操作就可以对原始对象进行而不影响它的副本。关于 Java 中的拷贝方法,有许多种实现方式,而本文将带您了解其中最常用的类型。
一、什么是拷贝
拷贝即是复制某个对象的值或属性到另一个对象中,因此拷贝是一种非常重要的操作,可以在许多场景中使用,如保留原有数据、线程操作中使用等。Java 中的拷贝操作分为两种:浅拷贝和深拷贝。
1.浅拷贝
浅拷贝是指复制对象的顶层成员,顶层成员包括基本数据类型和对象类型,但是不包括其它嵌套对象的属性,浅拷贝实际上是复制了对象的引用而不是实际的值。
2.深拷贝
深拷贝是指复制对象的所有属性,包括其它嵌套对象的属性,每个对象都可以创建自己的对象副本,这样就可以避免对象引用相同的问题。
二、如何进行浅拷贝
Java 中提供了 Cloneable 接口以及 Object 中的 clone() 方法实现对象的浅拷贝,但是还需要重写 Object 的 clone() 方法,以实现根据对象创建其自己的拷贝。
代码示例:
1、首先定义一个需要进行拷贝的 Student 类:
public class Student implements Cloneable {
private String name;
private int age;
private School school;
省略构造方法和getter/setter方法
重写clone方法
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
} }
2、创建一个包含嵌套对象的拷贝类 School:
public class School {
private String name;
省略构造方法和getter/setter方法
重写clone方法
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
3、创建一个测试类来测试上述类的浅拷贝操作:
public class Test {
public static void main(String[] args) throws
CloneNotSupportedException {
School school = new School("University of Washington"); Student originalStudent = new Student("Alice", 18, school);
浅拷贝
Student copyStudent = (Student) originalStudent.clone();
System.out.println("Original student: " + originalStudent);
System.out.println("Copy student: " + copyStudent);
System.out.println("Original and copy objects are equal: " +
(originalStudent == copyStudent));
}
}
输出结果:
Original student: Student{name='Alice', age=18,
school=School{name='University of Washington'}}
Copy student: Student{name='Alice', age=18,
school=School{name='University of Washington'}}
Original and copy objects are equal: false
从上述结果可以看出,创建的对象之间是相互独立的,但它们引用相同的对象。这就是浅拷贝的本质。
三、如何进行深拷贝
Java 中提供了另一个实现方式,对于拷贝对象中的每一个嵌套对象,都要进行拷贝操作,而不是简单地指向相应的对象引用。深拷贝的实现方式有很多,下面给出一个示例代码来表明这个底层原理。
代码示例:
1、首先定义一个需要进行拷贝的 Student 类,我们复制了深层次嵌套的成员:
public class Student implements Cloneable {
private String name;
private int age;
private School school;
省略构造方法和getter/setter方法
重写clone方法,实现深拷贝
@Override
public Object clone() throws CloneNotSupportedException {
Student student = (Student) super.clone(); student.school = (School) school.clone();
return student;
}
}
2、我们定义一个包含嵌套对象的拷贝类 School:
public class School implements Cloneable {
private String name;
省略构造方法和getter/setter方法
重写clone方法,实现深拷贝
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
3、创建一个测试类来测试上述类的深拷贝操作:
public class Test { public static void main(String[] args) throws
CloneNotSupportedException {
School school = new School("University of Washington");
Student originalStudent = new Student("Alice", 18, school);
深拷贝
Student copyStudent = (Student) originalStudent.clone();
System.out.println("Original student: " + originalStudent);
System.out.println("Copy student: " + copyStudent);
System.out.println("Original and copy objects are equal: " +
(originalStudent == copyStudent));
System.out.println("Original and copy objects are equals: " +
originalStudent.equals(copyStudent));
}
}
输出结果:
Original student: Student{name='Alice', age=18,
school=School{name='University of Washington'}}
Copy student: Student{name='Alice', age=18, school=School{name='University of Washington'}}
Original and copy objects are equal: false
Original and copy objects are equals: true
从上述结果可以看出,创建的对象之间是相互独立的,并且它们引用不同的对象。这就是深拷贝的本质。
总结
Java 中提供了两种拷贝方法,浅拷贝和深拷贝。浅拷贝只是复制对象的引用,而深拷贝则是复制整个对象。浅拷贝的实现方式是重写 Object 的 clone() 方法,而深拷贝则是对于对象中的每一个嵌套对象都要进行拷贝操作。在实际开发中,我们需要根据实际情况选择合适的拷贝方式,以便更好地保护对象。