美文网首页
java面试题-这道题的输出结果?

java面试题-这道题的输出结果?

作者: 暖熊熊 | 来源:发表于2017-10-16 12:46 被阅读0次
    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;
                } finally {
                    this.setValue(value);
                    System.out.println(value);
                }
            }
        }
    
        static class B extends A {
            public B() {
                super(5);
                setValue(getValue() - 3);
            }
    
            public void setValue(int value) {
                super.setValue(2 * value);
            }
        }
    }
    

    正确的结果是:

    22
    34
    17
    

    首先new一个B的对象,执行B的构造函数,super(5); super表示调用父类的构造方法,然后调用A的构造方法,public A(int v),然后调用setValue(v)方法,这时候子类重写了父类的setValue方法,所以调用的是B的setValue方法,然后B的setValue调用了父类的setValue,这时候新建对象的value变成了10,然后执行setValue(getValue()-3),getValue方法try中value变成了11,然后return前要执行finally块,finally块中this指的是B的setValue方法,因此,setValue执行完后value变成了22,输出22,然后getValue返回是11,减去3,是8,setValue(8),调用B的setValue后value变成了16,然后执行getValue方法,value变成17,然后准备返回17,finally块改变value为34,然后输出34,最后输出return的17。

    相关文章

      网友评论

          本文标题:java面试题-这道题的输出结果?

          本文链接:https://www.haomeiwen.com/subject/dqekuxtx.html