Java中super()的构造函数调用顺序

Java中super()的构造函数调用顺序,java,constructor,Java,Constructor,我试图解释为什么此代码没有返回我期望的结果: public class Bike { int height; int color; public Bike(int height, int color) { this.height = height; this.color = color; } } public class MountainBike extends Bike { public MountainBike(int

我试图解释为什么此代码没有返回我期望的结果:

public class Bike {
    int height;
    int color;
    public Bike(int height, int color) {
        this.height = height;
        this.color = color;
    }
}

public class MountainBike extends Bike {
    public MountainBike(int height, int color) {
        super(height, color);
        super.height = 200;
        System.out.println(super.height);
        System.out.println(height);
    }
}

public class Main {

    public static void main(String[] args) {
        MountainBike a = new MountainBike(1, 1);

    }
}
返回

200
1
我希望System.out.printlnheight打印出200,但实际上只有超级调用可以

行动顺序如下:

0。声明所有字段,包括超类字段,并分配内存

一,。来自MountainBike构造函数的超级调用被调用

二,。调用来自Bike构造函数的超级调用

三,。调用对象超级调用

四,。Bike字段已初始化,在这种情况下不会发生任何事情

五,。Bike构造函数被执行高度和颜色被设置为来自MountainBike的超级调用的参数

六,。MountainBike字段已初始化,在这种情况下不会发生任何事情

七,。如果执行MountainBike构造函数,则应将super.height设置为200,然后两个System.out.println调用都应返回200


在这种情况下,有人能指出我的错误吗?

System.out.printlnheight;在MountainBike中,构造函数正在打印传递给构造函数的参数值,即1。面对多个同名变量,Java将首先使用作用域中最接近的变量。

您所做的与构造函数的顺序无关

您正在通过参数隐藏字段高度。 现在,您正在更新字段,并且仅更新字段

您可以打印字段,然后打印参数,该参数仍然是传递给构造函数的原始值


顺便说一句:首先执行Bike构造器。

我有一个任务给你:检查什么是阴影,以及如何避免阴影或使用阴影。为什么首先调用Bike构造器?在这种情况下,它会被执行,但我认为它不会首先被调用。我改了。呼叫顺序:山地自行车->自行车。执行顺序:自行车->山地车