我正在编写这个小程序,但是有一个我找不到的错误。我已经在互联网上搜索和阅读了好几个小时,但我一直收到相同的错误消息: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 +
'}';
} }
这是因为行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 +
'}';
}
}