首先定义了个支持变量复制的图书类Book,类的所有属性为基本类型,它的clone方法重写方法只是简单的调用Object类继承clone方法,来实现对当前类变量的复制。然后定义了一个支持类变量复制操作集合类BookCollection,该类具有对象数组类型的属性成员,所以它的clone重写方法比较复杂,需要新建全部的内部属性成员,创建一个新的复制实际,并使用当前类变量相应字段的内容初始化新对象的所有字段,实现所谓的深层复制,而不是浅表复制。
public class ClassDefinitionMethod {
public static void main(String[] args) {// TODO Auto-generated method stub
// 新建图书集合类变量,修改部分图书信息
BookCollection bc1 = new BookCollection(10);
bc1.getBooks()[0].setBookID(33);
bc1.getBooks()[1].setISBN("96010009876");
for (int i = 0; i < 10; i++) {
System.out.println(bc1.getBooks()[i].getBookID());
System.out.println(bc1.getBooks()[i].getISBN());
}
// 使用clone方法实现类变量赋值
BookCollection bc2 = (BookCollection) bc1.clone();
System.out.println(bc2.getBooks()[0].getBookID());
System.out.println(bc2.getBooks()[1].getISBN());
}
}
class BookCollection implements Cloneable {
// 存储所有图书类变量的数组
private Book[] books = null;
// 图书总数
private int number;
public BookCollection() {
}
public BookCollection(int number) {
this.number = number;
books = new Book[number];
// 每个图书类变量的ID都是一个从1开始连续分配的整数
for (int i = 0; i < books.length; i++) {
books[i] = new Book(i + 1);
}
}
// 支持类变量复制的方法
public Object clone() {
// 新建图书集合类变量
BookCollection result = new BookCollection();
// 将新建类变量的所有图书信息与当前图书信息相同
result.books = new Book[number];
for (int i = 0; i < number; i++) {
result.books[i] = (Book) books[i].clone();
}
return result;
}
// 图书数组的读取函数
public Book[] getBooks() {
return books;
}
}
class Book implements Cloneable {
private int bookID;
public int getBookID() {
return bookID;
}
public void setBookID(int bookID) {
this.bookID = bookID;
}
public String getISBN() {
return ISBN;
}
public void setISBN(String iSBN) {
ISBN = iSBN;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
private String ISBN;
private String title;
public Book() {
}
public Book(int bookID) {
setBookID(bookID);
}
public Book(int bookID, String ISBN, String title) {
setBookID(bookID);
setISBN(ISBN);
setTitle(title);
}
// 支持类变量复制的重要方法
public Object clone() {
Object obj = null;
try {
obj = super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
}