构造方法和重写方法调用顺序

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

执行顺序:

  1. 1、调用B类的构造方法,执行super(5);,去调用父类的构造方法public A (int v) {},执行setValue(int value);,而 setValue(int value);方法是被子类B重写了的,那么调用的就是子类B的setValue(int value);方法。
  2. 调用B的setValue(int value),方法中又通过super调用父类的setValue(int value);,把value设置为10。
  3. 继续执行B类的setValue(getValue()- 3);,先调用getValue(),因为子类没有重写该方法,所以调用父类的getValue(),父类的getValue()中先执行value++,value变成11,调用return value ,因为要先执行完finally代码块,所以11这个返回值会先暂存起来。
  4. 但是return之前先执行finally中的代码,执行this.setValue(value);去调用子类的重写方法。把value设置成22。之后再returnvalue的值。
  5. 再执行setValue(11-3),调用子类的setValue(),再调用super.setValue(2 * value);,把value设置为16
  6. 至此,子类B的构造方法执行完成,看main方法中的该代码(new B().getValue()),可得知,还要再调用getValue()方法,继续按照第3步骤的执行,输出34。
  7. 此时main方法中的System.out.println()获得getValue()返回的17,进行输出。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值