簡體   English   中英

使用具有子類變量的父類方法而不覆蓋

[英]Using a method of parent class with variable of child class without overriding

我目前正在用Java設計兩個類,並且在理解我當前的繼承問題時遇到了一些麻煩,因此我創建了一個簡單的示例代碼,希望有人可以幫助我理解正在發生的事情。

因此,在此示例中,父類(出於通用目的,我們可以將其稱為Car類)和子類(RedCar類)。 父類是抽象的,包含一個屬性距離,並包含一個computeVelocity方法,該方法采用輸入參數時間(雙精度),並返回距離的雙精度值除以時間(從而得出速度)。

子類具有構造函數RedCar(double inputDistance)。 它也應該可以訪問computeVelocity方法,而不要覆蓋它。

這就是問題所在。 從邏輯上講,我知道computeVelocity不應從RedCar中獲取inputDistance變量,因為它調用了另一個類的方法。 但是,我想知道的是如何將該方法引入RedCar類,以便可以在傳遞給構造函數的參數的情況下在該類中使用它。

這是代碼示例

//Car Class
public abstract class Car{
  //abstract variable
  private double distance;
  //compute velocity method
  public double computeVelocity(double time){
     return distance/time;
  }
 }




 //RedCar Class
 public class RedCar extends Car{
   public double distance;

   public RedCar (double inputDistance){
      this.distance = inputDistance;
   }
  //This is currently my method but I believe this already constitutes as overridding
  public double computeVelocity(double hours){
      Car.super.computeVelocity(hours);
  }
 }

正如對您的回答的一些評論中所述,您實際上並不需要兩次間隔(一次在父類中,一次在子類中)。 使用父類的distance參數,沒有理由覆蓋您的方法。 您可以使用super關鍵字調用父類方法。

希望這可以幫助。

由於私有實例變量是在子類中繼承的,但不能在子類中訪問(您可以使用反射來訪問它)。 通過提供公共setter或getter方法或提供受保護的或公共的構造函數並從子類調用該構造函數,您可以通過兩種方式在Car實例變量私有雙倍距離中提供值。

參見鏈接子類是否繼承私有字段? 繼承私有字段

超類中的構造函數會在私有距離變量中設置值,因為私有成員只能通過其自身的成員通過自己的方法和構造函數來訪問。

    protected Car(double distance){
     this.distance = distance;
     }

同樣,您也不需要在子類中再次定義距離變量,因為您沒有在(子類的)方法computeVelocity中使用它。 由於子類方法調用,因此超類方法和超類方法使用自己的私有雙倍距離。 因此,您的距離變量在超類方法未使用的子類中定義。

在超類中提供受保護的構造函數后,您可以使用super關鍵字從子類構造函數中調用它。super關鍵字調用超類的構造函數。 由於我們在超類中提供了構造函數,因此java不會在超類中添加任何默認的構造函數。 並使用super從子類調用該構造函數,將值分配給私有double distance變量

     public RedCar(double inputDistance) {
     super(inputDistance);

      }

調用super類方法的正確方法是,不需要Car.super

    public double computeVelocity(double hours) {
      return super.computeVelocity(hours);
     }

您的RedCar類繼承了Car類。 因此, Car不僅是另一類。 如果創建RedCar實例,則Car所有部分也都可用。 RedCar Car

在您的解決方案中,您已經在父類和子類中創建了一個場distance 實際上,每個RedCar實例中都有兩個名為distance字段。

這里考慮了可見性。 盡管私有變量distanceRedCar一部分,但僅在Car類中可見。 如果僅Car定義的方法需要訪問distance ,則無需更改可見性。 但是您需要一種設置distance 如果該值不隨時間變化,則應在Car類中包含一個構造函數。

Car定義的方法computeVelocity()的可見性是公共的,因此無需在子類中重復它。 因為RedCarCar您可以在每個RedCar實例上調用computeVelocity()

public abstract class Car{
  private double distance;

  // Constructor with visibility protected.
  // So it is visible in each subclass and must be 
  // called by each subclass constructor.
  // Btw.: It is common practice to use the same name
  // for input parameters as for fields. The field
  // variable can be accessed with the "this" keyword.
  protected Car(double distance) {
    this.distance = distance;
  }

  //compute velocity method
  public double computeVelocity(double time){
     return distance/time;
  }
}


public class RedCar extends Car{
  public double distance;

  public RedCar (double distance){
    // Call the Car constructor
    super(distance)
  }

  // No need to repeat the definition of 
  // computeVelocity unless you want to redefine 
  // the behaviour..
}

然后,當您創建RedCar實例時:

RedCar redCar = new RedCar(100.0);

首先調用RedCar構造函數,然后調用Car構造函數,將distance字段設置為100.0

您可以調用該方法:

double velocity = redCar.computeVelocity(60.0);

暫無
暫無

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

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