Java 私有变量的继承
我肯定以前有人问过这个问题,但我找不到我的问题的确切答案。假设我们有以下两门课:Java 私有变量的继承,java,oop,inheritance,Java,Oop,Inheritance,我肯定以前有人问过这个问题,但我找不到我的问题的确切答案。假设我们有以下两门课: public abstract class Vehicle { private int gasTank; private int milesDriven; void Vehicle(int gas, int milesDriven) { gasTank = gas; this.milesDriven = milesDriven; } voi
public abstract class Vehicle {
private int gasTank;
private int milesDriven;
void Vehicle(int gas, int milesDriven) {
gasTank = gas;
this.milesDriven = milesDriven;
}
void move(int miles) {
gasTank -= subclass.getMileage() * miles; // I know this doesn't work but bear with me
milesDriven += miles;
}
}
public class HyundaiSonata extends Vehicle {
private int mileage;
void HyundaiSonata () { super(40, 5000); }
int getMileage() {return mileage;}
}
基本上,我的问题在第11行。没有办法访问子类方法或字段,因为继承只会向上流动,所以我应该如何构造它呢
编辑:请注意,该解决方案应适用于一般情况,即我有数百辆不同的车辆扩展车辆类您需要覆盖子类中的You move方法。使move方法在父类中抽象 我可以争论的一个方法是让车辆类有许多子类,在这种情况下,您不可能在车辆类中编写移动方法,因为您不知道要引用哪个子类 这是正确的代码
public abstract class Vehicle {
private int gasTank;
private int milesDriven;
void Vehicle(int gas, int milesDriven) {
gasTank = gas;
this.milesDriven = milesDriven;
}
// make this function abstract
abstract void move(int miles);
}
public class Hyundai Sonata extends Vehicle {
private int mileage;
void Hyundai Sonata () { super(40, 5000); }
void getMileage() {return mileage;}
//override it here
@Override
public void move(int miles){
gasTank -=this.getMileage() * miles;
milesDriven += miles;
}
}
编辑1:-
正如你在评论中指出的,这里有一种解决方法
将里程变量设置为车辆类别的实体
因此,您的车辆等级将如下所示
public abstract class Vehicle {
private int gasTank;
private int milesDriven;
private int mileage;
void Vehicle(int gas, int milesDriven,int mileage) {
gasTank = gas;
this.milesDriven = milesDriven;
this.mileage=mileage;
}
public void move(int miles){
gasTank -=mileage * miles;
milesDriven += miles;
}
}
你的小班看起来像
public class Hyundai Sonata extends Vehicle {
private int mileage;
void Hyundai Sonata () { super(40, 5000,mileage); }
}
}
加
在超类和子类中,需要覆盖它它应该是:
public abstract class Vehicle {
private int gasTank;
private int milesDriven;
void Vehicle(int gas, int milesDriven) {
gasTank = gas;
this.milesDriven = milesDriven;
}
protected abstract int getMileage(); // Introduce this abstract method
void move(int miles) {
gasTank -= subclass.getMileage() * miles;
milesDriven += miles;
}
}
public class HyundaiSonata extends Vehicle {
private int mileage;
void HyundaiSonata () { super(40, 5000); }
@Override
public int getMileage() {return mileage;}
}
通过使
抽象
,您可以强制子类实现getmiliege
方法。这样子类只需实现车辆
类未知的行为,不知道/与移动
方法的逻辑分离。应该是这样的
public abstract class Vehicle {
private int gasTank;
private int milesDriven;
Vehicle(int gas, int milesDriven) {
gasTank = gas;
this.milesDriven = milesDriven;
}
void move(int miles) {
gasTank -= this.getMileage() * miles;
milesDriven += miles;
}
abstract int getMileage()
}
public class HyundaiSonata extends Vehicle {
HyundaiSonata () { super(40, 5000); }
@Override
int getMileage() {
return 5;
}
}
您的
move
方法应适用于Vehicle
的任何实例,这意味着每辆车辆
都必须支持getmiliness()
方法。这建议您将该方法移动到基类。子类不继承其父类的私有成员。这是不正确的RCORDOVA。子类会继承,只是它是隐藏的。但是GetMiledge方法应该返回一个不同的值,这取决于确切车辆的里程数。如果该值在子类中,我将如何访问该值?子类不继承私有字段,但您可以使用公共或受保护的方法,子类可以使用这些方法访问私有字段。fan-Shashank这是我最初的解决方案。然而,我只是简单地复制粘贴我的代码,OOP应该可以帮助避免这种情况。如果我有接近100个子类,我怎么能避免覆盖每个move方法呢?这就是我试图做的。但出于某种原因,每当我做这样的事情:车辆[]车辆=新车[]新现代索纳塔,新福特卡车};对于(车辆下一个:车辆)下一个。移动(20);最后发生的事情是,milesDriven更新为5020,但当福特卡车移动时,milesDriven更新为5040,如果这有任何意义的话。好像只有一份milesDriven@stackUnderflow我不明白你想说什么。对不起,我不小心按了enter键,我现在正在编辑基本上,由于某种原因,我只有一份milesDriven。我进行了三次检查,我将milesDriven变量设置为static的明显答案是不正确的。它不是静态的,是受保护的,但每次我更新milesDriven时,由于某种原因,它是累积的
public abstract class Vehicle {
private int gasTank;
private int milesDriven;
Vehicle(int gas, int milesDriven) {
gasTank = gas;
this.milesDriven = milesDriven;
}
void move(int miles) {
gasTank -= this.getMileage() * miles;
milesDriven += miles;
}
abstract int getMileage()
}
public class HyundaiSonata extends Vehicle {
HyundaiSonata () { super(40, 5000); }
@Override
int getMileage() {
return 5;
}
}