【问题标题】:java: clone method violationjava: 克隆方法违规
【发布时间】:2012-09-14 12:58:47
【问题描述】:

后面的代码:

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

【问题讨论】:

    标签: java clone cloneable


    【解决方案1】:

    来自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 的转换将起作用。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果 clone() 受到保护,那么它对 A 可用,如果 B 扩展 A,那么 B 应该可以访问 clone ?
      • @rd4code 查看我的回答。 B 可以访问 clone 方法。但是 B 应该通过继承而不是直接通过 A 来访问它。
      猜你喜欢
      • 2012-12-18
      • 2017-05-16
      • 2018-08-20
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多