[牛客网试题] Test.main() 函数执行后的输出是()
1 public class test { 2 public static void main(string [] args){ 3 system.out.println(new b().getvalue()); 4 } 5 static class a{ 6 protected int value; 7 public a(int v) { 8 setvalue(v); 9 } 10 public void setvalue(int value){ 11 this.value = value; 12 } 13 public int getvalue(){ 14 try{ 15 value++; 16 return value; 17 } catch(exception e){ 18 system.out.println(e.tostring()); 19 } finally { 20 this.setvalue(value); 21 system.out.println(value); 22 } 23 return value; 24 } 25 } 26 static class b extends a{ 27 public b() { 28 super(5); 29 setvalue(getvalue() - 3); 30 } 31 public void setvalue(int value){ 32 super.setvalue(2 * value); 33 } 34 } 35 }
a选项 11 17 34
b选项 22 74 74
c选项 6 7 7
d选项 22 34 17
答案: d选项
解析:
首先,super()函数指的是调用父类的构造方法
① new b()执行b的构造函数
第一行是super(5);
此时执行的是a的构造函数,a的构造函数调用的是setvalue()方法,由于b重写了a的这个方法,
所以!!!执行的是b的 setvalue()方法。
即传入的参数是2*5=10
此时,因为super,所以调用的是父类的 setvalue()方法,即value=10
第一行执行完毕。
第二行是 setvalue(getvalue()-3);
b没有getvalue()方法,故执行父类的此方法,
try返回的是value=10+1=11,保存在临时栈中
finally中调用this的方法,这个this指的是b的对象,又重写,故就是b的 setvalue()方法
value=2*11=22,第一个打印到屏幕上的数字
接下来参数 getvalue()-3=11-3=8
传入b的 setvalue()方法
此时value=2*8=16
至此,new b()执行结束
② new b(). getvalue()
b没有 getvalue(),故执行a的 getvalue()
try返回16+1=17,保存到临时栈中
finally调用b的 setvalue()方法
value=17*2=34,第二个打印到屏幕上面的数字
最后主函数打印返回值,也就是打印try保存到临时栈中的17
上一篇: 使用PHP开发HR系统(6)
下一篇: photoshop正确的打开方式