浅拷贝
浅拷贝:拷贝其目标对象的引用,与原对象指向的是同一块地址空间,故拷贝对象对其属性进行修改时,其原对象的属性值也会发生修改
代码
class Student{
public int age;
public String name;
public Student(int age,String name){
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
public class Demo2 {
public static void main(String[] args) {
Student s1 = new Student(20,"张三");
//浅拷贝 -- 拷贝的是对象的引用 两个对象指向同一块内存空间
//对属性值进行修改时 原对象的属性也会发生修改
Student s2 = s1;
s2.setAge(50);
s2.setName("李四");
System.out.println("拷贝对象s2:"+s2);
System.out.println("原对象s:"+s1);
System.out.println("比较两对象的地址是否相同:"+s2.equals(s1)); // true
}
}
深拷贝
说明:对对象进行拷贝时,是重新创建一块新的内存空间进行拷贝,指向的是那一块新的内存空间的地址,故再对其属性值进行修改时,不会影响原对象的属性值
实现操作
1.类实现Cloneable接口
public interface Cloneable { }
当我们进入Cloneable接口时,发现其里面没有任何方法。这表明这就是一个空接口,也叫做标记接口,其作用就是表示当前对象是可以被克隆的
2.重写clone()方法
@Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }
代码
class Student implements Cloneable{
public int age;
public String name;
public Student(int age,String name){
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Demo2 {
public static void main(String[] args) throws CloneNotSupportedException {
Student s1 = new Student(20,"张三");
//深拷贝
Student s2 = (Student) s1.clone();
s2.setName("李四");
s2.setAge(30);
System.out.println("原对象:"+s1);
System.out.println("深拷贝后对象:"+s2);
System.out.println("比较两对象地址是否相同:"+s1.equals(s2));
}