Java错误创建子类构造函数

时间:2014-11-22 03:25:33

标签: java inheritance

我试图学习一些Java,但我却陷入了创建子类​​的困境。我一直收到There is no default constructor available in...错误。

这是代码:

class Car 
{
    String name;
    int speed;
    int gear;
    int drivetrain;
    String direction;
    String color;
    String fuel;

    public Car(String carName, int carSpeed, String carDirection, String carColor, int carDriveTrain, int carGear)
    {
        name = carName;
        speed = carSpeed;
        gear = carGear;
        drivetrain = carDriveTrain;
        direction = carDirection;
        color = carColor;
        fuel = "Gas";
    }

    void shiftGears(int newGear){gear = newGear; }
    void accelerateSpeed(int acceleration){speed = speed + acceleration;  }
    void applyBrake(int brakingFactor){ speed = speed - brakingFactor;}
    void turnWheel(String newDirection){ direction = newDirection; }

}//end of Car class

class Suv extends Car
{

    void applyBrake(int brakingFactor)
    {
        super.applyBrake(brakingFactor);
        speed = speed - brakingFactor;

    }
}

当我尝试创建" Suv"子类。我究竟做错了什么?谢谢!

4 个答案:

答案 0 :(得分:2)

自" Car"有一个构造函数,从Car派生的任何子类也需要一个构造函数。所以首先你需要在Suv类中放置一个构造函数。

示例:

class Suv extends Car {
    public Suv() {
        super( /* here you need to pass arguments to create a car */);
        // any other constructor code
    }
}

答案 1 :(得分:2)

您可能希望在Suv中创建以下构造函数,以初始化Car构造函数具有的参数:

public Suv(String carName, int carSpeed, String carDirection, String carColor, int carDriveTrain, int carGear)
{
    super (carName, carSpeed, carDirection, carColor, carDriveTrain,carGear);
}

另一种方法是将无参数构造函数添加到Car,在这种情况下,Sub的默认构造函数将调用该构造函数:

public Car()
{

}

答案 2 :(得分:1)

将以下构造函数添加到Car

public Car(){}

问题是无法创建Suv,因为为了运行Suv的默认构造函数,需要首先运行Car的构造函数,Car具有Suv只有一个接受参数的构造函数,因此它不能用作默认构造函数。

正如@Markus建议的那样,另一种方法是在super中实现一个构造函数,该构造函数将使用所有必需参数调用Suv。无论哪种方式,主要的想法是,为了实例化Car我们需要首先实例化{{1}}否则我们将得到编译器错误。

答案 3 :(得分:0)

我建议不要将SUV类放在同一个文件中。相反,在当前包中创建另一个类,将其命名为SUV,扩展它并通过以下两种语法之一调用超类构造函数:

super(); //calls the superclass no-argument constructor with no parameter list

super(parameter list); //calls the superclass constructor with a matching parameter list