最近在自學Introduction to Java Programming那本書,package testOOP;public class House implements Cloneable, Comparable {private int id;private double area;private java.util.Date whenBuilt;public House(int id, double area) {this.id = id;this.area = area;whenBuilt = new java.util.Date();}public double getId() {return id;}public double getArea() {return area;}public java.util.Date getWhenBuilt() {return whenBuilt;}/** Override the protected clone method defined in the Objectclass, and strengthen its accessibility */public Object clone() {try {return super.clone();}catch (CloneNotSupportedException ex) {return null;}}/** Implement the compareTo method defined in Comparable */public int compareTo(Object o) {if (area > ((House)o).area)return 1;else if (area < ((House)o).area)return -1;elsereturn 0;}public static void main(String[] args){House house1 = new House(1, 200.12);House house2 = (House)house1.clone();}}1,不明白的就是House類是Object類的子類那么就相應繼承Protected native Object clone()這一方法,可為什么書上說必須覆蓋此方法并將修飾符改為public以便任何包中均可使用?難道不改,House類的實例house1就不能使用嗎?(在我刪去覆蓋的clone()方法后,Eclipse提示錯誤Unhandled exception type CloneNotSupportedException)2,我不刪去整個方法,只是刪去try-catch塊留下return super.clone()也是提示錯誤Unhandled exception type CloneNotSupportedException,這是為什么?
2 回答

白板的微信
TA貢獻1883條經驗 獲得超3個贊
Object類的方法:
protected native Object clone() throws CloneNotSupportedException;
1、如果不實現clone,那么執行到House house2 = (House)house1.clone(); 會報錯,因為House沒有clone方法,不能克隆。
將clone()修飾符改為public,是因為這樣可以在外部調用house.clone(),否則重載就沒有意義。
2、如果去掉try...catch...,編譯return super.clone();會報錯,因為super.clone()定義時聲明了異常,所以在調用時,必須捕獲這個異常。如果不捕獲,在House.clone()方法聲明也可以:
public Object clone() throws CloneNotSupportedException;
這樣,你在調用house.clone()時就必須try...catch...

倚天杖
TA貢獻1828條經驗 獲得超3個贊
e house2 = (House)house1.clone();
要使用這個就必須實現cloneable接口,不實現就報錯
Object的現實是if(!this instanceof Cloneable){throw new CloneNotSupportedException();}
- 2 回答
- 0 關注
- 427 瀏覽
添加回答
舉報
0/150
提交
取消