java - 具有来自继承的抽象类的值的构造函数,该抽象类实现了一个接口(interface)

标签 java inheritance constructor interface abstract-class

我试图通过构造函数实例化 Car 类型的对象,但收到以下 2 个错误:“静态字段 Vehicle.name 应以静态方式访问”和“无法分配最终字段 Vehicle.name”在构造函数 this.变量,除了 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;     
    }
}

最佳答案

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

如果您希望它们成为实例字段,请按照定义 numWheels 的方式定义它们,将它们放入类中,而不是放入接口(interface)中。在这里,您的意思似乎是让 Vehicle 成为 LandVehicle 扩展的父类(super class),因此将其设为一个类。

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

关于java - 具有来自继承的抽象类的值的构造函数,该抽象类实现了一个接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51486315/

相关文章:

javascript - 如何从核心 OpenERP 6.1 继承 javascript

.net - 如何从 NUnit 中的继承测试名称中排除类名

java - 如何创建一个类并添加到 for 循环中的列表中接收来自控制台的输入

javascript - 销毁构造函数实例

java - 哈希表实现 iterate 和 findMin

java - 如何在命令行中显示 "pgbench"信息并读取

java - Android APK 无法安装在设备上

java - 如何使用 Spring Java 应用程序使 IBM MQ 监听器进程缓慢

python - Django 中的可重用模态成员

java - 使用 lombok 注释的继承会出错