我目前正在使用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);
}
}
答案 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
的字段。
考虑到可见性。虽然私有变量distance
是RedCar
的一部分,但它仅在类Car
中可见。如果只有Car
中定义的方法需要访问distance
,则无需更改可见性。但是你需要一种方法来设置distance
。如果值不随时间变化,则应在类Car
中包含构造函数。
computeVelocity()
中定义的方法Car
的可见性是公开的,因此无需在子类中重复它。由于RedCar
是Car
,您可以在每个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);