Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Inheritance - Fatal编程技术网

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