实现克隆方法-错误Java:clone()已保护java.lang.Object中的访问

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

我正在编写这个小程序,但是有一个我找不到的错误。我已经在互联网上搜索和阅读了好几个小时,但我一直收到相同的错误消息:java:clone()已保护java.lang.Object中的访问。我正在尝试在Point上实现方法clone(),以便在执行Main之后,只有c1会移动到To。有人可以告诉我问题出在哪里,如何解决?

public class Main {
    public static void main(String[] args) {
        Point p = new Point(5,7);
        Circle c1 = new Circle(p, 3);
        Circle c2 = new Circle(p, 5);

        System.out.println("c1 = " + c1);
        System.out.println("c2 = " + c2);

        c1.moveTo(2,3);
        Circle cloned = (Circle) c2.clone();

        System.out.println("c1 = " + c1);
        System.out.println("c2 = " + c2);
    } }

 public class Circle {
     public final Point center;
     public final int radius;

     public Circle(Point center, int radius) {
         this.center = center;
         this.radius = radius;
     }

     public void moveTo(int x, int y){
         center.setX(x);
         center.setY(y);
     }

     @Override
     public String toString() {
         return "Circle{" +
                 "center=" + center.toString() +
                 ", radius=" + radius +
                 '}';
     } }

public class Point implements Cloneable{
    private int x;
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    @Override
    public String toString() {
        return "Point{" +
                "x=" + x +
                ", y=" + y +
                '}';
    } }
java clone
1个回答
0
投票

这是因为行Circle cloned = (Circle) c2.clone();您正在尝试访问定义的类之外的受保护成员。受保护的方法只能在相同的类或子类中调用。

如果您真的只想在Main类中访问它,然后重写Circle类中的clone()方法并将其设置为public并编写您自己的实现如果需要。

class Circle {
    public final Point center;
    public final int radius;

    public Circle( Point center, int radius ) {
        this.center = center;
        this.radius = radius;
    }

    public void moveTo( int x, int y ) {
        center.setX( x );
        center.setY( y );
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        // TODO: Your custom clone logic
        return super.clone();
    }

    @Override
    public String toString() {
        return "Circle{" +
            "center=" + center.toString() +
            ", radius=" + radius +
            '}';
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.