Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用具有子类变量的父类方法而不重写_Java_Inheritance_Parent Child_Parent_Overriding - Fatal编程技术网

Java 使用具有子类变量的父类方法而不重写

Java 使用具有子类变量的父类方法而不重写,java,inheritance,parent-child,parent,overriding,Java,Inheritance,Parent Child,Parent,Overriding,我目前正在用Java设计两个类,在理解当前的继承问题时遇到了一些困难,因此我创建了一个简单的示例代码,希望有人能帮助我理解正在发生的事情 所以在这个例子中,一个父类(一般来说,我们可以称之为类Car)和一个子类(类RedCar)。父类是抽象的,它包含一个属性距离,并包含一个computeVelocity方法,该方法接受输入参数time(double),并返回距离除以时间的双倍值(从而给出速度) 子类有一个构造函数RedCar(double inputDistance)。它还应该可以访问compu

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

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

子类有一个构造函数RedCar(double inputDistance)。它还应该可以访问computeVelocity方法,而不重写它

这就是问题所在。逻辑上,我理解computeVelocity不应该从RedCar获取inputDistance变量,因为它调用了另一个类的方法。然而,我想知道的是,如何将该方法引入RedCar类中,以便在该类中使用它,并将参数传递给构造函数

    protected Car(double distance){
     this.distance = distance;
     }
下面是一个代码示例

//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
关键字调用父类方法


希望这能有所帮助。

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


希望这有帮助。

因为私有实例变量在子类中继承,但在子类中不可访问(您可以使用反射来访问它)。通过提供public setter或getter方法,或者提供protected或public构造函数并从子类调用该构造函数,您有两种方法来提供车内实例变量private double distance的值

请参见“继承专用字段”链接

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

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

因为私有实例变量在子类中继承,但在子类中不可访问(您可以使用反射来访问它)。通过提供public setter或getter方法,或者提供protected或public构造函数并从子类调用该构造函数,您有两种方法来提供车内实例变量private double distance的值

请参见“继承专用字段”链接

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

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

您的类
RedCar
继承类
Car
。所以
Car
不仅仅是另一个类。如果创建一个
RedCar
实例,则
Car
的所有部分也都可用。
红色汽车
是一辆
汽车

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

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

Car
中定义的方法
computeVelocity()
的可见性是公共的,因此无需在子类中重复该方法。因为
RedCar
Car
你可以调用