public 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
首先new一个B的对象,执行B的构造函数,super(5); super表示调用父类的构造方法,然后调用A的构造方法,public A(int v),然后调用setValue(v)方法,这时候子类重写了父类的setValue方法,所以调用的是B的setValue方法,然后B的setValue调用了父类的setValue,这时候新建对象的value变成了10,然后执行setValue(getValue()-3),getValue方法try中value变成了11,然后return前要执行finally块,finally块中this指的是B的setValue方法,因此,setValue执行完后value变成了22,输出22,然后getValue返回是11,减去3,是8,setValue(8),调用B的setValue后value变成了16,然后执行getValue方法,value变成17,然后准备返回17,finally块改变value为34,然后输出34,最后输出return的17。
网友评论