Java必须实现继承的方法吗?

时间:2016-10-13 14:10:43

标签: java inheritance

我必须将类几何对象扩展为类三角形。

我似乎无法找到导致编译器说出错误的错误

"必须实现继承方法GeometricObject.getArea" "必须实现继承方法GeometricObject.getPerimeter"

这是我的三角形代码

public class Triangle extends GeometricObject {



double side1 = 1.0;
double side2 = 1.0;
double side3 = 1.0;

    public Triangle()
    {

    }

    public Triangle(double s1, double s2, double s3)
    {
        double side1 = s1;
        double side2 = s2;
        double side3 = s3;
    }

    public void getSide1()
    {
        System.out.print(side1);
    }

    public void getSide2()
    {
        System.out.print(side2);
    }

    public void getSide3()
    {
        System.out.print(side3);
    }


    public double getArea(double s1, double s2, double s3)
    {
        double s = (s1+s2+s3);
        double area = Math.sqrt((s-s1)-(s-s2)-(s-s3));
        return area;

    }

    public double getPerimeter(double s1, double s2, double s3)
    {
        double peri = (s1+s2+s3);
        return peri;
    }

    public String toString()
    {
        return ("Triangle Side 1: " + side1 + " Triangle Side 2: " + side2 + " Triangle Side 3: " + side3);
    }

}

这是geometricobject的代码

    public abstract class GeometricObject { 
  private String color = "white"; 
  private boolean filled; 
  private java.util.Date dateCreated;

  /** Construct a default geometric object */ 
  protected GeometricObject() { 
          dateCreated = new java.util.Date(); 
        } 

 /** Construct a geometric object with color and filled value */ 
   protected GeometricObject(String color, boolean filled) { 
        dateCreated = new java.util.Date(); 
        this.color = color; this.filled = filled; 
        }

 /** 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, the get method is named 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 */ 
         public String toString() {
            return "created on " + dateCreated + "\ncolor: " + color + " and filled: " + filled; }

        /** Abstract method getArea and getPerimete */
           public abstract double getArea();    //abstract method
           public abstract double getPerimeter();
        } 

有人可以指出我错过了什么吗?

5 个答案:

答案 0 :(得分:2)

父类中的这两个方法:

public abstract double getArea();
public abstract double getPerimeter();

...标记为abstract。这意味着子类必须1)实现它们,或2)声明自己abstractabstract class Triangle extends GeometricObject)。

请注意,它们都没有声明任何参数。 getArea中的getPerimeterTriangle带有参数(三个双打),因此他们没有提供上述两种方法的实现,这些方法并不适用

要非抽象,Triangle必须:

@Override
public double getArea() {
    // ...implementation...
}
@Override
public double getPerimeter() {
    // ...implementation...
}

请注意,与您目前拥有的那些不同,不接受任何参数。

您的方法不需要参数;相反,请使用您的实例字段side1side2side3

@Override
public double getArea()
{
    double s = this.side1 + this.side2 + this.side3;
    double area = Math.sqrt((s - this.side1) - (s - this.side2) - (s - this.side3));
    return area;
}

@Override
public double getPerimeter()
{
    double peri = this.side1 + this.side2 + this.side3;
    return peri;
}

答案 1 :(得分:1)

在您的子类中,您没有覆盖GeometricObject类中名为getArea()和getParimeter()的抽象方法。您只是在子类中重载它们(getArea()和getPermission()方法),例如检查两个类中相应方法的原型,因为它们不相同。     定义getArea()[和getparimeter()]方法如下(在子类中):

public double getArea(){
  // your code goes here... 

  }

OR再次声明它们如下:

   public abstract double getArea();

然后你将不得不让你的孩子课抽象,这将使你无法创造它(儿童类')对象。

答案 2 :(得分:0)

您的getArea()方法是抽象的。因此,它应该在某处有一个定义。这是因为当您将方法声明为抽象时,在声明它的类中,您不能拥有它的主体。因此,在子类中,您需要提供它。

抽象方法更多的是确保所有子类遵循该方法的相同签名,即使每个子类'对此的定义可能不同。

所以改变你的参数,使签名匹配。

因此,您已将getArea()声明为abstract,请在签名中添加所需的3个双参数。

即。您的声明应该是:

public abstract double getArea(double s1,double s2,double s3);

答案 3 :(得分:0)

您不会覆盖,而是重载 getAreagetPerimeter - 覆盖意味着根据规范实施该方法超类,重载意味着使用参数扩展方法,但保持名称和返回类型与重载方法相同。

答案 4 :(得分:0)

或者您需要在抽象类中为抽象方法添加参数:

public abstract double getArea(double side1, double side2, double side3);

    //abstract method
public abstract double getPerimeter(double side1, double side2, double side3);