美文网首页
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