Test.main() 函数执行后的输出是()
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;
} catch(Exception e){
System.out.println(e.toString());
} finally {
this.setValue(value);
System.out.println(value);
}
return 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类后先执行B类的构造方法的super(5)。
第二步:执行super(5)的构造方法setValue(v),由于B类重写了A类的setValue(int value)方法,因此A类的setValue(int value)会被B类的setValue(int value)方法覆盖。
因此调用B类的setValue(int value)方法,执行super.setValue(2 * value),此时value=10。
第三步:执行setValue(getValue() - 3),因为子类没有getValue()方法,调用父类的getValue()方法,在try中value=10+1=11,在执行return时会将返回值(11)存在临时栈中。finally中执行this.setValue(value),其中这个this指的是B类的方法,因此继续执行B类的setValue(int value)方法,则value=112=22,输出22.
getValue()等于返回的值(11),即刚刚存储的11的值,则setValue(11-3)继续调用B类的setValue(int value)方法,value=82=16。到此new B()完
第四步:调用new B()的getValue()方法,进入try中value=16+1=17,在执行return时会将返回值(17)存在临时栈中。finally中执行this.setValue(value),其中这个this指的是B类的方法,因此继续执行B类的setValue(int value)方法,则value=17*2=34,输出34.则new B().getValue()等于返回的值(17)