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构造器?在这种情况下,它会被执行,但我认为它不会首先被调用。我改了。呼叫顺序:山地自行车->自行车。执行顺序:自行车->山地车