简体   繁体   English

比较两个对象,java

[英]Compare two objects, java

I have two classes, one Circle() and the other GeometricObject(). 我有两个类,一个是Circle(),另一个是GeometricObject()。 I have to extend GeometricObject to circle then implement comparable in GeometricObject. 我必须将GeometricObject扩展为圆形,然后在GeometricObject中实现可比性。 When i do so i get an error in my Circle() class that says cannot override abstract method and Circle() is not abstract. 当我这样做时,我在Circle()类中收到一个错误,提示无法覆盖抽象方法,而Circle()不是抽象的。 I also have to compare the two in a test/main class, anyone have any ideas as to how i can fix the error and compare the two? 我还必须在测试/主类中比较两者,有人对我如何解决错误并比较两者有任何想法? Thanks in advance. 提前致谢。

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 Class: 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();

}

The problem is that GeometricObject is declared to implement Comparable : 问题在于, GeometricObject被声明为实现Comparable

public abstract class GeometricObject implements Comparable {

That means any concrete subclass has to implement the compareTo method, for example: 这意味着任何具体的子类都必须实现compareTo方法,例如:

@Override public int compareTo(Object o) {
    Circle circle = (Circle) o;
    return Double.compare(getArea(), circle.getArea());
}

With that change, it compiles for me in JDK 7. 有了这一更改,它就可以在JDK 7中为我编译。

You don't override the two methods because the method from superclass are abstract. 您不会覆盖这两个方法,因为超类中的方法是抽象的。 Therefore you have to implement them and not override them (coresponds with "cannot override abstract method"). 因此,您必须实现它们而不是覆盖它们(具有“不能覆盖抽象方法”的核心)。

You also nee to provide this method in Circle. 您还需要在Circle中提供此方法。

@Override
public int compareTo(Object o) {
    // TODO Auto-generated method stub
    return 0;
}

GeometricObject doesn't need to implement this method because the class is abstract. GeometricObject不需要实现此方法,因为该类是抽象的。 But Circle is not and therefore has to implement all methods (Comparable forces this method; coresponds with "Circle() is not abstract"). 但是Circle不是,因此必须实现所有方法(与此方法相当的力;与“ Circle()不是抽象”相对应)。

You can't compare GeometricObject with a Circle because GeometricObject is abstract which mean you can't creates instances of this class. 您不能将GeometricObject与Circle进行比较,因为GeometricObject是抽象的,这意味着您无法创建此类的实例。

This is because your ComparableObject class implements Comparable interface which has: 这是因为您的ComparableObject类实现了Comparable接口,该接口具有:

int compareTo(Object o)

You must implement all abstract methods in non-abstract class. 您必须在非抽象类中实现所有抽象方法。 In this case, in every classes derived from ComparableObject you have to add implementation comparTo , because this is abstract method. 在这种情况下,在从ComparableObject派生的每个类中,您都必须添加实现comparTo ,因为这是抽象方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM