一个很有水平的题

Test.main() 函数执行后的输出是()

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

输出

22
34
17

第一步:执行new B()
进入B类后先执行B类的构造方法的super(5)。
第二步:执行super(5)的构造方法setValue(v),由于B类重写了A类的setValue(int value)方法,因此A类的setValue(int value)会被B类的setValue(int value)方法覆盖。
因此调用B类的setValue(int value)方法,执行super.setValue(2 * value),此时value=10。
第三步:执行setValue(getValue() - 3),因为子类没有getValue()方法,调用父类的getValue()方法,在try中value=10+1=11,在执行return时会将返回值(11)存在临时栈中。finally中执行this.setValue(value),其中这个this指的是B类的方法,因此继续执行B类的setValue(int value)方法,则value=112=22,输出22.
getValue()等于返回的值(11),即刚刚存储的11的值,则setValue(11-3)继续调用B类的setValue(int value)方法,value=8
2=16。到此new B()完
第四步:调用new B()的getValue()方法,进入try中value=16+1=17,在执行return时会将返回值(17)存在临时栈中。finally中执行this.setValue(value),其中这个this指的是B类的方法,因此继续执行B类的setValue(int value)方法,则value=17*2=34,输出34.则new B().getValue()等于返回的值(17)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值