被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Schoolbag implements Cloneable{
private String name;
private Book book;
public Schoolbag(String name, String bookName) {
this.name = name;
this.book = new Book(bookName);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
@Override
protected Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
}
public class CopyTest {
public static void main(String[] args) {
// 原始对象
Schoolbag original = new Schoolbag("A","物理");
System.out.println("原对象的值 "+original.getName() + " - " + original.getBook().getName());
// 拷贝对象
Schoolbag cloned = (Schoolbag) original.clone();
System.out.println("拷贝对象的值 "+ cloned.getName() + " - " + cloned.getBook().getName());
System.out.println("原始对象和拷贝对象是否一样 " + (original == cloned));
System.out.println("原始对象和拷贝对象的name属性是否一样 " + (original.getName() == cloned.getName()));
System.out.println("原始对象和拷贝对象的book属性是否一样 " + (original.getBook() == cloned.getBook()));
original.setName("B");
original.getBook().setName("音乐");
System.out.println("改后,原始对象的值 " + original.getName() + " - " + original.getBook().getName());
System.out.println("再看看拷贝对象的值 " + cloned.getName() +" - " + cloned.getBook().getName());
}
}
实现了Cloneable 接口,重写了clone() 其实就是调用了super.clone() 。可以看到原始对象的的name 属性所做的改变未能影响到拷贝对象,但是引用对象book 的 name 属性所做的改变影响到了拷贝对象。