【问题标题】:clone() has protected access - made public Object clone()clone() 具有受保护的访问权限 - 公开对象 clone()
【发布时间】:2013-04-09 07:42:12
【问题描述】:

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

所讨论的对象 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();


    }
}

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

clone() has protected access in Object

我尝试在 Octagaon 中重命名克隆方法,对 cloneme 说,但后来我收到错误:

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

我觉得问题是因为 Octagon 扩展了另一个对象,也许?

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

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

【问题讨论】:

  • 您不能将受保护的方法重写为公开的。在您的 Octagon 类中将其定义为 protected Object clone()

标签: java clone


【解决方案1】:

替换

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

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

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

【讨论】:

  • 正是需要的。非常感谢。我需要使用类似的东西来调用自定义 compareTo(Octagon o) 函数以及 ((Octagon)test).compareTo(copy); 似乎很荒谬,这在我的教科书中没有提到。
  • 克隆被广泛认为是设计糟糕的,这就是为什么你可能在教科书中看不到太多。
  • 不幸的是,文本中的分配特别需要使用克隆。 =\ 不过读起来很有趣,谢谢。
  • 你好,你能解释一下为什么需要双重演员吗?我对此感到困惑,谢谢!
  • @Scaramouche test 变量的类型是Object。所以它必须被强制转换才能找到clone 方法。那么clone 的返回类型也是Object,这意味着它必须再次强制转换才能分配给类型为Object 的̀copy` 变量。
【解决方案2】:

你可以写一个拷贝构造函数:

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

并从克隆方法中使用它:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2014-05-11
    • 1970-01-01
    • 2019-04-25
    • 2011-03-31
    • 2016-09-09
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多