java:克隆方法违规

时间:2012-09-22 07:34:17

标签: java clone cloneable

代码背后:

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吗?这可能吗?

2 个答案:

答案 0 :(得分:7)

clone()是受保护的方法,并且可以在子类中进行访问,并使用public访问权限覆盖它。

class A implements Cloneable{
    .....
    @Override
    public Object clone() throws CloneNotSupportedException{
      return super.clone();
    }
}

答案 1 :(得分:3)

来自Cloneable

的Javadoc
  

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

     

请注意,此接口不包含克隆方法。因此,仅仅通过实现该接口的事实来克隆对象是不可能的。即使反射调用clone方法,也无法保证它会成功。

Clone是java中的早期设计之一,它有缺陷

关于access- 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的转换将起作用。