Реализация метода клонирования - Ошибка java: clone () имеет защищенный доступ в java .lang.Object - PullRequest
0 голосов
/ 27 апреля 2020

Я пишу эту маленькую программу, но в ней есть ошибка, которую я не могу найти. Я искал и читал об этом в inte rnet в течение нескольких часов, но продолжаю получать одно и то же сообщение об ошибке: java: clone () имеет защищенный доступ в java .lang.Object. Я пытаюсь реализовать метод clone () в Point, чтобы после выполнения Main только c1 делал moveTo. Может кто-нибудь сказать, пожалуйста, в чем проблема и как ее решить?

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 +
                '}';
    } }

1 Ответ

0 голосов
/ 27 апреля 2020

Это потому, что строка Circle cloned = (Circle) c2.clone(); Вы пытаетесь получить доступ к защищенному члену вне класса, который он определил. Защищенный метод может быть вызван только в том же или дочернем классе.

, если вы действительно хотите получить к нему доступ только в классе Main , затем переопределите 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 +
            '}';
    }
}
...