簡體   English   中英

為什么子類繼承私有字段?

[英]Why subclasses inherit private fields?

我正在創建一個新的 class 這是車輛。 我期待唯一受保護的變量繼承給子類。 但是當我嘗試使用 IDE 創建構造函數時,它是否也在使用超類私有變量? - 這是私人字符串車輛名稱 - 我不清楚這種情況。 我不應該使用自動構造函數嗎?

public class Vehicle {
    protected int capacityOfPassengers;
    protected String mapOfRoute;
    private String vehicleName;

    public Vehicle(int capacityOfPassengers, String mapOfRoute, 
                   String vehicleName) {

        this.capacityOfPassengers = capacityOfPassengers;
        this.mapOfRoute = mapOfRoute;
        this.vehicleName = vehicleName;
    }
}

public class LandVehicle extends Vehicle {
    private String brand;
    private int priceModel;

    public LandVehicle(int capacityOfPassengers, String mapOfRoute, 
                       String vehicleName, String brand, int priceModel) {

        super(capacityOfPassengers, mapOfRoute, vehicleName);
        this.brand = brand;
        this.priceModel = priceModel;
    }
}

您不能從 LandVehicle 訪問 vehicleName。 您只需將一些字符串參數傳遞給超級構造函數,超級構造函數就會設置車輛名稱。 例如,您不能在 LandVehicle class 中將此字段初始化為this.vehicleName = vehicleName

通常,class 有一個默認構造函數,如果您沒有提供構造函數,則不使用 arguments。

當您使用LandVehicle子類Vehicle時,您的LandVehicleVehicle的一種。 這意味着它從其超類繼承方法和字段,即使它們是私有的。 對於 class LandVehicle ,這些成員只是不可見,但它們仍然存在 - 否則它無法正確 function。 private 關鍵字是一個訪問修飾符,它改變調用者的可見性。

因此,要實例化LandVehicle ,您還必須提供其超類Vehicle的必需屬性(因為Vehicle中沒有默認的、無參數的構造函數)。 在您的示例中,沒有名稱(來自Vehicle )的LandVehicle沒有意義,因為LandVehicleVehicle ,它需要名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM