判断程序输出的结果
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); } } }
答案
分析过程:
实例化B首先实例化A
在实例化B的时候,调用B的构造器,并将5作为参数传递给A的构造器,执行setValue方法,此时B类内已经对继承来的setValue进行了覆写,在内部又调用了A的setValue并将 2* 5=10 作为参数传递进去
此时B的成员value值是10,然后执行A的构造器内的setValue(getValue() -3)这一行代码,首先执行他继承来的getValue方法
在getValue中,value的值加1变为11,此时11要作为此方法的返回值被返回,接下来执行finally块内的代码,再次调用B的setValue方法将value的值设置为22,并将value打印出来(22)
接下来setValue(getValue() - 3)内的变量就得到返回了,那就是11,于是将其减去3得到8,并作为参数传递,接下来又是调用setValue将8乘以2得到16进行传递,然后按照上面的顺序 加1 得到17 并等待返回
然后finally块内,17乘以2得到34输出(34)
最后17被返回,打印(17)