Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:克隆方法冲突_Java_Clone_Cloneable - Fatal编程技术网

java:克隆方法冲突

java:克隆方法冲突,java,clone,cloneable,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;

代码隐藏:

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
    }
}
我知道我试图将一个对象的字段分配给一个完全不同的对象,这违反了克隆的含义。但让我困惑的是错误陈述

语句:“错误:克隆()在对象中具有受保护的访问权限”

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

是受保护的方法,若要在子类中进行访问,请使用
public
access覆盖它

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

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

请注意,此接口不包含克隆方法。因此,仅仅因为对象实现了该接口,就不可能克隆对象。即使以反射方式调用clone方法,也不能保证它会成功

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

关于访问-
当一个方法受到保护时,它只能由类本身、类的子类或与类位于同一个包中的类来访问

因此,它可以在
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是一种父类型,因此从B到A的强制转换将起作用。

如果clone()受保护,那么它对A可用;如果B扩展了A,那么B应该可以访问clone?@rd4code查看我的答案。B有权访问克隆方法。但是B应该通过继承而不是直接通过A来访问它。