簡體   English   中英

java:克隆方法違規

[英]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

所以它可以在AB類中訪問,就像你在同一個包中碰巧是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM