簡體   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