Loading

成员变量的初始化时机

执行下面这段 Java 代码,它的输出结果为:调用子类的 addAge(), age=1

public class ClassInit {
    public static void main(String[] args) {
        Son son = new Son();
    }
}


class Father {
    private int age = 30;

    public Father() {
        this.addAge();
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void addAge() {
        this.age++;
        System.out.println("调用父类的 addAge(), age=" + this.age);
    }
}

class Son extends Father {
    private int age = 8;

    public Son() {
        super();
    }

    @Override
    public int getAge() {
        return age;
    }

    @Override
    public void setAge(int age) {
        this.age = age;
    }

    public void addAge() {
        this.age++;
        System.out.println("调用子类的 addAge(), age=" + this.age);
    }
}

原因分析:

  1. 首先在 main 方法中新建了一个 Son 对象, 此时应该调用 Son 的构造方法, 但是由于 Son 存在父类, 所以先执行父类的构造方法
  2. 在调用父类 Father 的构造方法时, 子类 Son 的成员变量还未进行初始化, 此时 son.age = 0, father.age = 30
  3. 又因为 Son 中重写了 Father 的 addAge 方法, 所以此时在 Father 的构造函数中调用的 addAge 方法是子类的实现
  4. 因此,输出结果为: 调用子类的 addAge(), age=1 而不是 调用子类的 addAge(), age=9

总结: 成员变量在构造函数之后初始化。

posted @ 2021-07-31 14:41  xtyuns  阅读(110)  评论(0编辑  收藏  举报