代码执行顺序的题目
public class TestClass {
static class Father{
public int money = 1;
public Father() {
this.money = 2;
showMoney();
}
protected void showMoney(){
System.out.println("I am Father , I hava $"+money);
}
}
static class Son extends Father{
public int money = 3;
public Son() {
this.money = 4;
showMoney();
}
protected void showMoney(){
System.out.println("I am Son , I hava $"+money);
}
}
public static void main(String[] args) {
Father guy = new Son();
System.out.println("This guy has $"+guy.money);
}
}
结果:
流程:
-
执行main的第一句
Father guy = new Son();
- 先执行父类的
- 属性赋值
public int money = 1;
- 父类的构造器
public Father() { this.money = 2; showMoney(); //这里调的是Son的showMoney() }
- Son的showMoney()
这时候son的money是0,因此第一条输出是I am Son , I hava $0
protected void showMoney(){ System.out.println("I am Son , I hava $"+money); }
- 属性赋值
- 执行Son的属性赋值
public int money = 3;
- 执行Son的构造器
此时在构造器里把money赋值成了4,所以调用 showMoney()的输出为public Son() { this.money = 4; showMoney(); }
I am Son , I hava $4
- 先执行父类的
-
执行main的第二句
System.out.println("This guy has $"+guy.money);
由于new 出来的对象是Father类型的,所以guy.money应该调的是father.money,由于之前在father的构造器里把father.money赋值成了2,所以这步输出为
This guy has $2