Java 使用重写方法在构造函数链执行期间调用哪个方法

Java 使用重写方法在构造函数链执行期间调用哪个方法,java,methods,constructor,chain,overriding,Java,Methods,Constructor,Chain,Overriding,使用重写方法在构造函数链执行期间调用哪个方法?给定以下两个类,我需要知道在创建MountainBike对象时将调用哪个setGear方法。我真正的项目与自行车无关,我正试图重写一个类来改变在超类的构造函数中调用的一个方法的行为,我不确定它应该如何工作 public class Bicycle { public int cadence; public int gear; public int speed; public Bicycle(int startCaden

使用重写方法在构造函数链执行期间调用哪个方法?给定以下两个类,我需要知道在创建MountainBike对象时将调用哪个setGear方法。我真正的项目与自行车无关,我正试图重写一个类来改变在超类的构造函数中调用的一个方法的行为,我不确定它应该如何工作

public class Bicycle {
    public int cadence;
    public int gear;
    public int speed;

    public Bicycle(int startCadence,
                   int startSpeed,
                   int startGear) {
        setGear(startGear);
        setCadence(startCadence);
        setSpeed(startSpeed);
    }

    public void setCadence(int newValue) {
        cadence = newValue;
    }

    public void setGear(int newValue) {
        gear = newValue;
    }

    public void applyBrake(int decrement) {
        speed -= decrement;
    }

    public void speedUp(int increment) {
        speed += increment;
    }        
}

public class MountainBike extends Bicycle {
    public int seatHeight;

    public MountainBike(int startHeight,
                        int startCadence,
                        int startSpeed,
                        int startGear) {
        super(startCadence, startSpeed, startGear);
        seatHeight = startHeight;
    }   

    public void setHeight(int newValue) {
        seatHeight = newValue;
    }

    public void setGear(int newValue) {
    if(newValue<4)
            gear = newValue;
        else{
            gear = 4;
        }

    }    
}
公共级自行车{
公共节奏;
公共int齿轮;
公共交通速度;
公共自行车(国际标准),
国际起动速度,
int startGear){
设置齿轮(起动齿轮);
设置频率(起始频率);
设定速度(起动速度);
}
公共无效设置间隔(int newValue){
cadence=新值;
}
公共无效设置设备(int newValue){
档位=新值;
}
公共无效applyBrake(整数递减){
速度-=减量;
}
公共空间加速(整数增量){
速度+=增量;
}        
}
公共级山地自行车{
公共海权;
公共山地车(int startHeight,
int STARTCANCE,
国际起动速度,
int startGear){
超级(StartCase、startSpeed、startGear);
seatHeight=startHeight;
}   
公共无效设置高度(int newValue){
seatHeight=新值;
}
公共无效设置设备(int newValue){

if(newValue如果调用它,子类的方法将执行。但是,它当前没有被调用。

如果实例化重写类,则其重写方法将被执行

Bicycle bike;

bike = new Bicycle(1,2,3);
bike.setGear(8);//Bicycle's setGear is run

bike = new MountainBike(1,2,3,4);
bike.setGear(8);//MountainBike's setGear is run
--Edit:反映OP编辑的问题(
setGear
现在从
Bicycle
的构造函数中调用)--


假设您实例化了一辆
MountainBike
MountainBike
setGear
将被执行。

是的,重写基类方法以在派生类中创建和容纳新功能是定义子类型-多态特性的原因

Bicycle bike;

bike = new Bicycle(1,2,3);
bike.setGear(8);//Bicycle's setGear is run

bike = new MountainBike(1,2,3,4);
bike.setGear(8);//MountainBike's setGear is run
class A{methodA...}
class B extends A{methodA...}
A a=new B;
a.methodA(); <<<< this should call B's methodA
class A{methodA…}
类B扩展了{methodA…}
A=新的B;

A.MultAd();

这里还有一些很好的答案,但是我想提到的是,你应该考虑使用构图。我已经看到许多项目都使用了继承,这些特征可以用更好的方式来完成。在以后的项目阶段,这会导致严重的问题和代码气味。


参见“偏好组合而非继承”:

正如其他人所指出的,调用的是子类“setGear”

然而,我想指出的是,在构造函数中调用重写的方法是危险的,并且是不受欢迎的,特别是当这些方法依赖于子类的字段时。问题是,您的山地车构造器看起来像:

public MountainBike(args...) {
  super(args);  // must come first!!!
  maxGear = 4;
}

当Bicycle构造函数调用setGear()时,它将调用MountainBike的setGear,但maxGear尚未设置-它将为0。

更一般地说,您不应该让对象引用逃逸它的构造函数,无论是通过将“this”作为参数传递给另一个类的方法还是通过调用可以重写的方法


即使可以,也不应该从超类构造函数调用重写的方法。原因是超类的构造函数在子类的构造函数之前运行,对象状态可能不一致。例如,子类中的最终字段尚未设置。

根本不调用setGear方法。也许你想在你的构造函数?我的错…它应该在Bicycle类的构造函数中调用…假设在Bicycle类构造函数中使用setGear来设置gear属性-修复了示例代码…@Steve编写一个简单的测试并亲自看看Java做了什么是很容易的…@AndresF。是的,你是正确的,但这不会请帮助我理解为什么我看到了我看到的结果,如果我在代码中做了一些错误,也不要帮助我,因为我不确定它应该如何开始工作。感谢所有的帮助,但我找到了一个更好的例子,其中有我正在寻找的答案…我想我应该在询问…+1指出之前花更多的时间搜索“在构造函数中调用被重写的方法是危险的,不受欢迎”