使用父类的方法和子类的变量而不覆盖

时间:2016-07-24 18:23:51

标签: java inheritance parent-child parent override

我目前正在使用Java设计两个类,并且在理解我当前的继承问题时遇到了一些麻烦,因此我创建了一个简单的示例代码,希望有人能帮助我了解正在发生的事情。 / p>

所以在这个例子中,父类(通用,我们可以称之为类Car)和子类(类RedCar)。父类是抽象的,包含属性距离,并包含computeVelocity方法,它接受输入参数时间(double),并返回distance的double值除以时间(从而给出速度)。

子类有一个构造函数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);
  }
 }

3 个答案:

答案 0 :(得分:0)

正如你回答的一些评论中所述,你并不真正需要并且不应该有两次距离(一次在父类中,一次在子类中)。使用父类中的距离参数,没有理由覆盖您的方法。您可以使用super关键字调用父类方法。

希望这有帮助。

答案 1 :(得分:0)

由于私有实例变量在子类中继承但在子类中不可访问(您可以使用反射来访问它)。通过提供公共setter或getter方法或提供受保护或公共构造函数并从子类调用该构造函数,您有两种方法在Car实例变量私有双距离中提供值。

请参阅链接Do subclasses inherit private fields? inherit-private-fields

超类中的构造函数,它在私有距离变量中设置值,因为私有成员只能由自己的成员访问,这意味着它们自己的方法和构造函数。

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

而且你也不需要在子类中再次定义距离变量,因为你没有在你的方法computeVelocity(子类)中使用它。由于子类方法调用超类方法而超类方法使用自己的私有双距离。所以你的距离变量在超类方法中没有使用的子类中定义。

在超类中提供受保护的构造函数后,可以使用super关键字从子类构造函数中调用它.super关键字调用超类的构造函数。因为我们在超类中提供构造函数所以java不会在超类中添加任何默认构造函数。并使用super在子类中调用该构造函数来指定私有双距离变量

中的值
     public RedCar(double inputDistance) {
     super(inputDistance);

      }

调用超类方法的正确方法是,不需要Car.super

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

答案 2 :(得分:0)

您的班级RedCar会继承班级Car。所以Car不仅仅是另一个类。如果您创建RedCar实例,则Car的所有部分也可用。 RedCar Car

在您的解决方案中,您已在超类和子类中创建了一个字段distance。实际上,每个distance实例中都有两个名为RedCar的字段。

考虑到可见性。虽然私有变量distanceRedCar的一部分,但它仅在类Car中可见。如果只有Car中定义的方法需要访问distance,则无需更改可见性。但是你需要一种方法来设置distance。如果值不随时间变化,则应在类Car中包含构造函数。

computeVelocity()中定义的方法Car的可见性是公开的,因此无需在子类中重复它。由于RedCarCar,您可以在每个computeVelocity()个实例上调用RedCar

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);