9

这是我的基类:

abstract public class CPU extends GameObject {
    protected float shiftX;
    protected float shiftY;

    public CPU(float x, float y) {
        super(x, y);
    }

这是它的子类之一:

public class Beam extends CPU {
    public Beam(float x, float y, float shiftX, float shiftY, int beamMode) {
        try {
            image = ImageIO.read(new File("/home/tab/Pictures/Beam"+beamMode+".gif"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        this.x = x;
        this.y = y;
        this.shiftX = shiftX;
        this.shiftY = shiftY;
    }

新构造函数被突出显示,它说:

Constructor CPU in class CPU cannot be applied to given types:
required: float, float
found: no arguments

如何解决?

4

4 回答 4

17

正如错误试图告诉您的那样,您需要将参数传递给基类的构造函数。

添加super(x, y);

于 2013-01-17T17:21:02.677 回答
4

最终对象需要使用其构造函数之一初始化超类。如果存在默认(无参数)构造函数,则编译器会隐式调用它,否则子类构造函数需要使用super其构造函数的第一行来调用它。

在你的情况下,那将是:

public Beam(float x, float y, float shiftX, float shiftY, int beamMode) { 
  super(x, y)

并删除分配给this.xthis.y以后。

另外,避免制作它们protected,使其难以调试。而是添加gettersand 如果绝对必要setters

于 2013-01-17T17:24:46.233 回答
2

我怀疑你应该写

protected float shiftX;
protected float shiftY;

public CPU(float x, float y, float shiftX, float shiftY) {
    super(x, y);
    this.shiftX = shiftX;
    this.shiftY = shiftY
}

public Beam(float x, float y, float shiftX, float shiftY, int beamMode) {
    super(x,y,shiftX,shiftY);
    try {
        image = ImageIO.read(new File("/home/tab/Pictures/Beam"+beamMode+".gif"));
    } catch (Exception e) {
        throw new AssertionError(e);
    }
}
于 2013-01-17T17:23:44.347 回答
2

如果你没有指定任何默认构造函数,那么在编译时它会给你这个错误“类中的构造函数不能应用于给定类型;” 注意:如果您创建了任何参数化构造函数。

于 2018-03-08T12:23:19.360 回答