8

后面的代码:

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() 在对象中具有受保护的访问权限”

扩展 A 也应该clone()对 B 可用?如果是这样,那么 i 和 j 的值也应该复制到 l 和 m 吗?这可能吗 ?

4

2 回答 2

8

clone()是受保护的方法,要在子类中访问,请使用public访问权限覆盖它。

class A implements Cloneable{
    .....
    @Override
    public Object clone() throws CloneNotSupportedException{
      return super.clone();
    }
}
于 2012-09-22T07:36:05.153 回答
3

来自Cloneable的 Javadoc

按照惯例,实现此接口的类应使用公共方法覆盖 Object.clone(受保护的)。有关覆盖此方法的详细信息,请参阅 Object.clone()。

请注意,此接口不包含 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和分类Bjava.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 的转换将起作用。

于 2012-09-22T08:44:04.663 回答