繁体   English   中英

具有来自继承的抽象类的值的构造函数,该类实现一个接口

[英]Constructor with values from inherited abstract class, which implements an interface

我试图通过构造函数实例化Car类型的对象,并且收到以下2个错误:在构造函数上“静态字段Vehicle.name应该以静态方式访问”和“无法分配最终字段Vehicle.name”这个。 变量,除了numWheels。

public interface Vehicle 
{   
    String name = "";
    int maxPassengers = 0;
    int maxSpeed = 0;   
}

public abstract class LandVehicle implements Vehicle
{   
    int numWheels = 0;
    public abstract void drive();   
}

public class Car extends LandVehicle
{   
    public void soundHorn()
    {
        System.out.println("Beep, beep!");
    }

    public void drive()
    {
        System.out.println("Vroom, vroom!");
    }

    public Car(String name, int maxSpeed, int maxPassengers, int numWheels)
    {
        this.name = name;
        this.maxSpeed = maxSpeed;
        this.maxPassengers = maxPassengers;
        this.numWheels = numWheels;     
    }
}

如果在接口上定义字段,则将其视为常量。 它是公共的,静态的和最终的。 静态意味着,在每个对象实例中没有一个单独的成员变量,该类只有一个 而最终意味着该价值永远无法改变。 因此,在这种情况下,名称只能是长度为0的字符串,它属于接口,而不属于任何实现Vehicle的实例。

如果希望将它们作为实例字段,请按照定义numWheels的方式定义它们,将它们放在类中,而不是在接口中。 在这里,您似乎要使Vehicle成为LandVehicle扩展的超类,因此使其成为一个类。

接口描述了对象具有的功能,而没有提供实现(默认方法除外,暂时不要使用默认方法!)。 在接口中添加常量的功能很方便,在某些情况下,指定在调用该接口的方法时可能会使用的常量很有用。 使用接口来指定您的对象承诺实现的契约,该契约将在其中实现接口的方法。 请参见JDK中的接口示例,例如java.lang.CharSequence和java.util.List。

暂无
暂无

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

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