Java中的对象复制分为深复制和浅复制两种,本文将为大家介绍这两种复制方式,以及如何实现和应用。
一、浅复制
浅复制是指新对象只复制了原对象中的基本数据类型和引用类型变量的内存地址,而不会再次为引用类型创建新的内存空间,新对象和原对象共享引用类型变量所指向的内存空间。下面是一个浅复制示例:
public class Student implements Cloneable {
private String name;
private int age;
private Course course;
// ... 省略构造方法及setter/getter
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Course {
private String name;
// ... 省略构造方法及setter/getter
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Course java = new Course("Java");
Student alice = new Student("Alice", 18, java);
Student bob = (Student) alice.clone();
System.out.println("alice: " + alice.toString());
System.out.println("bob: " + bob.toString());
System.out.println("alice.getCourse() == bob.getCourse(): " + (alice.getCourse() == bob.getCourse()));
}
}
输出结果为:
alice: Student{name='Alice', age=18, course=Course{name='Java'}}
bob: Student{name='Alice', age=18, course=Course{name='Java'}}
alice.getCourse() == bob.getCourse(): true
可以看到,通过浅复制得到的bob
与原对象alice
具有相同的name
和age
属性,但是course
属性却是指向同一个对象java
的引用,这意味着bob
和alice
共享同一个Course
对象。
二、深复制
深复制是指新对象不仅复制了原对象中的基本数据类型和引用类型变量的内存地址,而且会再次为引用类型创建新的内存空间,使得新对象和原对象的引用类型变量具有不同的内存地址,不再共享任何一个对象。下面是一个深复制示例:
public class Student implements Cloneable {
private String name;
private int age;
private Course course;
// ... 省略构造方法及setter/getter
@Override
public Object clone() throws CloneNotSupportedException {
Student student = (Student) super.clone();
student.course = (Course) course.clone();
return student;
}
}
public class Course implements Cloneable {
private String name;
// ... 省略构造方法及setter/getter
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Course java = new Course("Java");
Student alice = new Student("Alice", 18, java);
Student bob = (Student) alice.clone();
System.out.println("alice: " + alice.toString());
System.out.println("bob: " + bob.toString());
System.out.println("alice.getCourse() == bob.getCourse(): " + (alice.getCourse() == bob.getCourse()));
}
}
输出结果为:
alice: Student{name='Alice', age=18, course=Course{name='Java'}}
bob: Student{name='Alice', age=18, course=Course{name='Java'}}
alice.getCourse() == bob.getCourse(): false
可以看到,通过深复制得到的bob
与原对象alice
具有相同的name
和age
属性,但是course
属性却是指向不同的对象的引用,这意味着bob
和alice
的Course
对象互不影响。
三、总结
浅复制和深复制都是实现对象复制的方式,但是它们之间复制的数据类型不同,应用场景也存在一定的区别。需要根据具体场景选择合适的方式进行对象的复制。
以上就是Java中对象的深复制和浅复制的介绍,希望可以帮助到大家。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍 - Python技术站