class Test {
public static void main(String[] args) {
System.out.println(new B().getValue());
}
static class A {
protected int value;
public A (int v) {
setValue(v);
}
public void setValue(int value) {
this.value= value;
}
public int getValue() {
try {
value ++;
return value;
} finally {
this.setValue(value);
System.out.println(value);
}
}
}
static class B extends A {
public B () {
super(5);
setValue(getValue()- 3);
}
public void setValue(int value) {
super.setValue(2 * value);
}
}
}
输出为:
22
34
17
执行顺序:
- 1、调用B类的构造方法,执行
super(5);
,去调用父类的构造方法public A (int v) {}
,执行setValue(int value);
,而setValue(int value);
方法是被子类B重写了的,那么调用的就是子类B的setValue(int value);
方法。 - 调用B的
setValue(int value)
,方法中又通过super调用父类的setValue(int value);
,把value设置为10。 - 继续执行B类的
setValue(getValue()- 3);
,先调用getValue()
,因为子类没有重写该方法,所以调用父类的getValue()
,父类的getValue()
中先执行value++
,value变成11,调用return value
,因为要先执行完finally代码块,所以11这个返回值会先暂存起来。 - 但是
return
之前先执行finally
中的代码,执行this.setValue(value);
去调用子类的重写方法。把value设置成22。之后再return
value的值。 - 再执行
setValue(11-3)
,调用子类的setValue()
,再调用super.setValue(2 * value);
,把value
设置为16 - 至此,子类B的构造方法执行完成,看main方法中的该代码
(new B().getValue())
,可得知,还要再调用getValue()
方法,继续按照第3步骤的执行,输出34。 - 此时main方法中的System.out.println()获得getValue()返回的17,进行输出。