类对象变量不同于一般的基本类型变量,它的内部具有属性变量成员和函数方法成员,往往需要自己实现复制方法。
protected Object clone() throws CloneNotSupportedException的功能:创建并返回当前类变量的一个副本,重写该函数方法的类需要实现接口Cloeable,否则会抛出CloneNotSupportedException的异常。即:类名implements Cloneable表示该对象能被克隆,能使用Object.clone()方法。
示例:
package org.test;
public class Exec {
public static void main(String args[]){
BookCollection bc1 = new BookCollection(10);
bc1.getBooks()[0].setBookID(100);
bc1.getBooks()[0].setISBN("4765689708");
BookCollection bc2 = ( BookCollection) bc1.clone();
System.out.println(bc2.getBooks()[0].getBookID());
System.out.println(bc2.getBooks()[0].getISBN());
}
}
package org.test;
public class BookCollection implements Cloneable{
private Book[] books = null;
private int number;
public BookCollection(){
}
public BookCollection(int number){
this.number = number;
books = new Book[number];
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;
}
}
package org.test;
public class Book {
private int bookID;
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 void setTitle(String title) {
this.title = title;
}
public void setISBN(String ISBN) {
this.ISBN = ISBN;
}
public void setBookID(int bookID) {
this.bookID = bookID;
}
public int getBookID(){
return bookID;
}
public String getISBN(){
return ISBN;
}
public String getTitle(){
return title;
}
public Object clone(){
Object obj = null;
try {
obj = new Book();
((Book)obj).setBookID(bookID);
((Book)obj).setISBN(ISBN);
((Book)obj).setTitle(title);
obj = super.clone();
} catch (Exception e){
System.out.println(e.getMessage());
}
return obj;
}
}