牛客网中的编程结果题
2019-05-02 22:14:23 五一,放假,躺尸中。。。迷茫!
记录下来,因为这是自己综合网上的答案和个人的感想,不想在某一年的某一个时候需要自己的“这种理解”的时候而找不到,也是方便对比是否有进步!
另外,记录生活的点滴,当某一天你学不动的时候,回首过去,自己已经努力了这么多了,不应该轻易放弃,再坚持,相信一切会好起来的!
package com.nepu; public class NiuKeWangTest_01 { public static void main(String[] args) { System.out.println(new B().getValue()); /** * 首先读者应该清楚的知识是:new B();的作用,new是执行所new类中的构造方法, * super是调用父类的构造方法,有参数则需要传递参数,this是调用当前运行的类 * * 第一步:先是new B(),则执行类B中的构造方法,即super(5),和setValue(getValue()-3); * (1)super(5),调用父类A中的构造方法,传入的参数是5, * 之后A中的构造方法调用setValue(a),将传入的5给setValue()方法作为参数 * 因为B类中重写了A类的setValue()方法,所以执行的是子类B中的setValue()方法,执 *行完成后value=value*2=10; * * (2)到此为止,super(5)执行完成,之后是执行B中构造方法的第二条语句。 *setValue(getValue()-3); * 即先是调用getValue()方法,B中没有过重写getValue()方法,所以执行其父类的 *getValue()方法, * value=value+1,value变成11,保存在临时栈中,之后执行A类中的finally代码, *this.setValue(value), * this指的是当前运行类即B类中的setValue()方法,则value变成22并且返回输出22 * 接下来getValue()-3=11-3=8,传入B中的setValue()方法中value=2*value=16; * *到此为止,new B()执行完成, * 接下来是new B().getValue();B类中没有getValue(()方法,所以找其父类中的 *getValue()方法, * try返回的是16+1=17 保存到临时栈中,然后执行finally中的this.setValue()方法, *则value=2*value=34;这是打印的第二个值到屏幕上去 * 最后,返回主函数,打印返回值17 * * */ } static class A { protected int value; public A(int a) { setValue(a); } public void setValue(int a) { this.value = a; } public int getValue() { try { value++; return value; } catch (Exception e) { // TODO: handle exception } finally { this.setValue(value); System.out.print(value); } return value; } } static class B extends A { public B() { super(5); setValue(getValue() - 3); } public void setValue(int value) { super.setValue(2 * value); } } }