我有两个类,一个是Circle(),另一个是GeometricObject()。我必须将GeometricObject扩展为circle,然后在GeometricObject中实现可比较。当我这样做时,我的Circle()类中出现错误,该错误表示无法覆盖抽象方法,而Circle()不是抽象的。我还必须在测试/主类中比较两者,任何人都有任何关于如何修复错误并比较两者的想法?提前谢谢。
package chapter_14;
public class Circle extends GeometricObject{ //here is where i get an error
private double radius;
public Circle() {
}
public Circle(double radius) {
this.radius = radius;
}
/** Return radius */
public double getRadius() {
return radius;
}
/** Set a new radius */
public void setRadius(double radius) {
this.radius = radius;
}
/** Return area */
@Override
public double getArea() {
return radius * radius * Math.PI;
}
/** Return diameter */
public double getDiameter() {
return 2 * radius;
}
/** Return perimeter */
@Override
public double getPerimeter() {
return 2 * radius * Math.PI;
}
/* Print the circle info */
public void printCircle() {
System.out.println("The circle is created " + getDateCreated() +
" and the radius is " + radius);
}
}
GeometricObject类:
package chapter_14;
public abstract class GeometricObject implements Comparable{
private String color = "white";
private boolean filled;
private java.util.Date dateCreated;
/** Construct a default geometric object */
protected GeometricObject() {
dateCreated = new java.util.Date();
}
/** Return color */
public String getColor() {
return color;
}
/** Set a new color */
public void setColor(String color) {
this.color = color;
}
/** Return filled. Since filled is boolean,
* so, the get method name is isFilled */
public boolean isFilled() {
return filled;
}
/** Set a new filled */
public void setFilled(boolean filled) {
this.filled = filled;
}
/** Get dateCreated */
public java.util.Date getDateCreated() {
return dateCreated;
}
/** Return a string representation of this object */
@Override
public String toString() {
return "created on " + dateCreated + "\ncolor: " + color +
" and filled: " + filled;
}
/** Abstract method getArea */
public abstract double getArea();
/** Abstract method getPerimeter */
public abstract double getPerimeter();
}
答案 0 :(得分:5)
问题是声明GeometricObject
实现Comparable
:
public abstract class GeometricObject implements Comparable {
这意味着任何具体的子类都必须实现compareTo
方法,例如:
@Override public int compareTo(Object o) {
Circle circle = (Circle) o;
return Double.compare(getArea(), circle.getArea());
}
通过这个改变,它在JDK 7中为我编译。
答案 1 :(得分:3)
您不会覆盖这两个方法,因为来自超类的方法是抽象的。因此,您必须实现它们而不是覆盖它们(与“不能覆盖抽象方法”相对应)。
您还需要在Circle中提供此方法。
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
GeometricObject不需要实现此方法,因为该类是抽象的。但Circle不是,因此必须实现所有方法(Comparable强制使用此方法;与“Circle()不相符”)。
您无法将GeometricObject与Circle进行比较,因为GeometricObject是抽象的,这意味着您无法创建此类的实例。
答案 2 :(得分:3)
这是因为您的ComparableObject
类实现了Comparable
接口,该接口具有:
int compareTo(Object o)
您必须在非抽象类中实现所有抽象方法。在这种情况下,在从ComparableObject派生的每个类中,您必须添加实现comparTo
,因为这是抽象方法。