一道笔试题引起的血案之查看程序运行结果

判断程序输出的结果this

 

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(e.toString());
            }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);
        }
    }
    
}

 

答案spa

分析过程code

实例化B首先实例化Ablog

在实例化B的时候,调用B的构造器,并将5做为参数传递给A的构造器,执行setValue方法,此时B类内已经对继承来的setValue进行了覆写,在内部又调用了A的setValue并将 2* 5=10 做为参数传递进去继承

此时B的成员value值是10,而后执行A的构造器内的setValue(getValue() -3)这一行代码,首先执行他继承来的getValue方法get

在getValue中,value的值加1变为11,此时11要做为此方法的返回值被返回,接下来执行finally块内的代码,再次调用B的setValue方法将value的值设置为22,并将value打印出来(22io

接下来setValue(getValue() - 3)内的变量就获得返回了,那就是11,因而将其减去3获得8,并做为参数传递,接下来又是调用setValue将8乘以2获得16进行传递,而后按照上面的顺序 加1 获得17 并等待返回class

而后finally块内,17乘以2获得34输出(34变量

最后17被返回,打印(17程序

相关文章
相关标签/搜索