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);
}
}
}