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