java抽象类构造函数不会像预测的那样工作

时间:2014-03-24 00:43:29

标签: java inheritance abstract-class super

所以我有这个抽象类:

abstract class Shape
{
   int Width;
   int Height;
   final String nazwaKształtu;

   public Shape(int w, String kształt)
   {
       nazwaKształtu = kształt;
   }
   public Shape(int w, int h, String kształt)
   {
       nazwaKształtu = kształt;
   }

   void setWidth(int w)
   {
       Width = w;
   }

}

另一个班级形状:

class Square extends Shape
{
    Square(int w, String kształt) {
        super(kształt);               // I get an error here
        Width = w;
        Height = w;
    }

    @Override
    void setWidth(int w)
    {
        Width = w;
        Height = w;
    }
    public int getWidth()
    {
        return Width;
    }

    public int getHeight(){
        return Height;
    }
}

但是我收到一条错误消息,告诉我类型有问题。但是在我的抽象类中,我确实有一个应该适用的构造函数。当我将Square类中的构造函数更改为:

Square(int w) {
        super("Prostokąt");
        Width = w;
        Height = w;
    }
它仍然无法运作。我犯了什么错误?

2 个答案:

答案 0 :(得分:3)

这一行super(kształt);表示你调用父元素的构造函数,它只需要一个参数,因为kształt是String,你必须有构造函数,它需要一个String作为参数来使用超级方法。

或者更喜欢它 - 在您的示例中,您希望使用调用此构造函数的super(w, kształt);public Shape(int w, String kształt)

答案 1 :(得分:1)

super(kształt)正在尝试查找仅接受String参数的构造函数,但找不到具有该签名的构造函数。

您没有提供在形状类中仅接受String的构造函数。所有提供的构造函数都接受不同的参数。 Java Compiler无法找到仅使用String作为参数的构造函数。

选择1 - 您可以在超类中添加构造函数。

public Shape(String kształt)
   {
       nazwaKształtu = kształt;
   }

选择2 - 如果由于某种原因你无法在超类中添加构造函数,那么你可能需要调用相应的构造函数,如

super(w, ksztatt);