分享一道题

直接上代码,分析输出结果:


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

敲重点,自己分析一遍,再继续往下看!!!




正确结果:

分享一道题_第1张图片

        很简单?嗯,确实简单,不过对于知识点不熟悉的友友们还是不太友好滴,首先,这道题解不出来,很大一部分原因,是友友没有静下心来思考,深呼吸,再捋一捋? 其次呢,是对于知识点还有点糊,警钟敲响啦!!!你认真了吗?努力了吗?今天有没有卷一波呢?哈哈哈!博主今天的废话有点多诶!好啦好啦,正经事来了!!!

这里为了更好的帮助友友理解,我们跟着调试,一步一步来看:

我呢,给友们录了一个视频,大家看看:

认真观看的小伙伴们应该有眉目了吧?自己去试试,就明白啦!!!


接下来,还是不懂的友友,往下看:

断点打在这里,往下运行,super的功能之一:调用父类的构造方法

进入父类构造方法: 

分享一道题_第2张图片

 构造方法中又调用了setValue方法:

分享一道题_第3张图片

 super的功能之二:super.func():调用父类的方法

 进入父类的setValue方法:

分享一道题_第4张图片

 此时的value值已经为10了

调用函数结束,沿路返回:

分享一道题_第5张图片

 回到这里,调用setValue方法中,先调用一次getValue方法:

分享一道题_第6张图片

这里给value++,则返回的value值为11,而finally的代码是一定会被执行的,所以进入 finally中,调用setValue方法:

分享一道题_第7张图片

因此,输出22

这里的调用结束,原路返回至:

分享一道题_第8张图片

getValue的返回值为11,所以setValue将8传入:

分享一道题_第9张图片 

再调用父类的 setValue,传入16:

分享一道题_第10张图片

此时value值被赋值为16,调用结束,一直返回至: 

分享一道题_第11张图片

 调用getValue方法:

分享一道题_第12张图片

在上述执行中,value为16,进入 getValue,value++,返回value为17,执行finally的代码,输出34

这里还有一个输出, 返回值为17,因此输出17

所以最终的输出为22  34  17

下期见!!!

你可能感兴趣的:(记录,Java,java,jvm,servlet)