clone() 具有受保护的访问权限 - 使对象克隆() 成为公共对象

问题描述 投票:0回答:3

我正在编写代码来创建一个对象,克隆该对象,然后比较两者。

所讨论的对象 Octagon 是对象 GeometricObject 的扩展

public class Octagon extends GeometricObject implements Comparable<Octagon>, Cloneable {
private double side;

public Octagon (double side){
    this.side = side;
}

public Object clone() throws CloneNotSupportedException {
    Octagon octClone = (Octagon)super.clone();
    return octClone;
}

在名为 Octagon.java 的文件中

在另一个 TestOctagon.java 中,是我的主要方法:

public class TestOctagon {
    public static void main(String[] args) {
        GeometricObject test = new Octagon(5); //create an Octagon with a side of 5
        System.out.println("Area is: "+test.getArea());
        System.out.println("Perimeter is: "+test.getPerimeter());

        Octagon copy = (Octagon)test.clone();


    }
}

错误出现在主方法的最后一行。

clone() has protected access in Object

我尝试重命名 Octagaon 中的克隆方法,例如cloneme,但随后出现错误:

cannot find symbol
symbol: method cloneme()
location: variable test of type GeometricObject

我感觉问题是因为八边形扩展了另一个对象,也许?

我真的找不到任何解决方案,我花了一个小时阅读这里所有其他的clone()帖子。

编辑:我需要使用克隆。我知道普遍的共识是克隆是无聊的。

java clone
3个回答
20
投票

更换

Octagon copy = (Octagon)test.clone();

Octagon copy = (Octagon)((Octagon)test).clone();

这样被调用的克隆方法就是你的类的方法。


9
投票

你可以编写一个复制构造函数:

public Octagon( Octagon right ){
    this.side = right.side;
}

并从克隆方法中使用它:

public Object clone() throws CloneNotSupportedException {
    return new Octagon( this );
}

0
投票

我也遇到了同样的错误,并通过在类中创建一个公共函数来解决它

public class Octagon { ....

    public Octagon copy() {
        try {
          return (Octagon) clone();
        } catch(Exception e) {
          return new Octagon();
        } 
    }
    
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.