[英]java: clone method violation
代碼背后:
class A implements Cloneable
{
int i, j;
A(int i, int j)
{
this.i = i;
this.j = j;
}
A()
{
}
}
class B extends A
{
int l, m;
B()
{
}
B(int l, int m)
{
this.l = l;
this.m = m;
}
public static void main(String l[])
{
A obj = new A(1, 2);
B obj1 = (B) obj.clone(); // ERROR
}
}
我知道我違反了克隆的含義,因為我試圖將一個對象的字段分配給一個完全不同的對象。 但它的錯誤陳述使我感到困惑。
聲明:“錯誤:clone()在Object中具有受保護的訪問權限”
擴展A應該使clone()
可用於B嗎? 如果是這樣,那么i和j的值應該復制到l和m嗎? 這可能嗎 ?
clone()是受保護的方法,並且可以在子類中訪問,使用public
訪問覆蓋它。
class A implements Cloneable{
.....
@Override
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
來自Cloneable的 Javadoc
按照慣例,實現此接口的類應使用公共方法覆蓋Object.clone(受保護)。 有關重寫此方法的詳細信息,請參閱Object.clone()。
請注意,此接口不包含克隆方法。 因此,僅僅通過實現該接口的事實來克隆對象是不可能的。 即使反射調用clone方法,也無法保證它會成功。
Clone
是Java早期的設計之一,它有缺陷
關於訪問 - When a method is protected, it can only be accessed by the class itself, subclasses of the class, or classes in the same package as the class
。
所以它可以在A
和B
類中訪問,就像你在同一個包中碰巧是java.lang
你可以在A
里面提供這樣的方法。
public A copy() throws CloneNotSupportedException {
return (A) clone();
}
正確實施
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
};
還記得父母不是孩子的類型,所以從A到B的投射將不起作用。 Child是Parent的類型,因此從B到A的轉換將起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.