簡體   English   中英

從java子類調用不在父類中的方法

[英]Calling method from java child class not in parent class

考慮以下基類/派生類:

public class Car {
    private int cylinders;

    public Car(int cyl) {
        cylinders = cyl;
    }

    public int getCylinders() {
        return cylinders;
    }
}

public class SportsCar extends Car  {
    private int topSpeed;

    public SportsCar(int cyl, int top) {
        super(cyl);
        topSpeed = top;
    }

    public int getTopSpeed() {
        return topSpeed;
    }
}

現在,考慮以下兩個對象:

    SportsCar lambo = new SportsCar(8,255);
    Car m5 = new SportsCar(10,240);

以下方法調用編譯正常:

lambo.getTopSpeed();

但是這個方法調用中斷錯誤“找不到符號 - 方法getTopSpeed()”

m5.getTopSpeed();   

現在我明白getTopSpeed方法必須存在於基類中才能編譯,因為m5Car類型,所以如果我在Car包含getTopSpeed那么m5.getTopSpeed(); 編譯得很好。

我的問題是:

  1. 為什么錯誤“找不到符號 - 方法getTopSpeed()”發生在編譯時而不是運行時?
  2. 為什么“后期綁定”不會阻止此錯誤?
  3. 假設getTopSpeed在程序運行時在Car中實現(所以它編譯),編譯器是否首先檢查Car是否存在getTopSpeed ,然后檢查它是否在SportsCar被覆蓋,或者只是“知道”它已經從編譯器中過度使用並直接使用過度使用的方法?
  1. Java是靜態類型語言,因此在編譯時應該知道變量類型。 如果編譯器已知的類型沒有公開這樣的方法 - 則編譯失敗。 正是因為不讓它運行的原因。

  2. 為什么要這樣? 它只是發現方法體遲到了,而不是簽名。 但是,靜態類型意味着必須在編譯時滿足簽名。

  3. 在運行時,JVM嘗試查找最具體的實現。 在SportsCar中,在您的情況下。 如果它是從父級繼承而在子級中不存在 - 則使用父級代碼。

如果需要從變量類型中缺少的特定子項調用方法 - 您可以在運行時將其強制轉換為ClassCastException。

這是因為當編譯器看到這個時:

SportsCar lambo = new SportsCar(8,255);
Car m5 = new SportsCar(10,240);

它知道lambo是一款SportsCar,但只知道m5是一輛Car。 如果你想獲得m5的最高速度,你必須先將它投射到SportsCar:

((SportsCar)m5).getTopSpeed();

然而,大多數時候我看過鑄造,變量首先被轉換為另一個變量:

SportsCar sportsM5 = (SportsCar)m5;
sportsM5.getTopSpeed();

當我將對象傳遞給方法時,Java中的多態性的這一方面使我感到困惑。

暫無
暫無

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

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