为何Java实例化子类时会递归调用父类构造方法

下面的代码输出结果会是什么?bash

public class A {
    double a;
    double b;
    A(){
        a = -1;
        b = -1;
    }
}

class B extends A{
    private double c;

    B(){
        c = -1;
    }
}

class Demo{
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        System.out.println(b.a);
    }
}
复制代码

答案是 -1.0。学习

缘由在于当实例化子类时会递归调用父类中的构造方法。而这又是为何呢?spa

首先,这涉及到Java对象的生命周期。在Java中,对象的生命周期包括如下几个阶段:线程

建立阶段(Created)
应用阶段(In Use)
不可见阶段(Invisible)
不可达阶段(Unreachable)
收集阶段(Collected)
终结阶段(Finalized)
对象空间重分配阶段(De-allocated)code

1. 建立阶段(Created)

在建立阶段系统经过下面的几个步骤来完成对象的建立过程:对象

为对象分配存储空间
开始构造对象
从超类到子类对static成员进行初始化
超类成员变量按顺序初始化,递归调用超类的构造方法
子类成员变量按顺序初始化,调用子类构造方法。
一旦对象被建立,并被分派给某些变量赋值,这个对象的状态就切换到了应用阶段。递归

2. 应用阶段(In Use)

对象至少被一个强引用持有着。生命周期

3. 不可见阶段(Invisible)

当一个对象处于不可见阶段时,说明程序自己再也不持有该对象的任何强引用,虽然该这些引用仍然是存在着的。进程

简单说就是 程序的执行已经超出了该对象的做用域 了。内存

4. 不可达阶段(Unreachable)

对象处于不可达阶段是指该对象再也不被任何强引用所持有。

与“不可达阶段”相比,“不可见阶段”是指程序再也不持有该对象的任何强引用,这种状况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被称为”GC root”。存在着这些GC root会致使对象的内存泄露状况,没法被回收。

5. 收集阶段(Collected)

当垃圾回收器发现该对象已经处于“不可达阶段”而且垃圾回收器已经对该对象的内存空间从新分配作好准备时,则对象进入了“收集阶段”。若是该对象已经重写了finalize()方法,则会去执行该方法的终端操做。

没有特殊缘由的话不要重载finazlie()方法,缘由有两点:

会影响JVM的对象分配与回收速度:
在分配该对象时,JVM须要在垃圾回收器上注册该对象,以便在回收时可以执行该重载方法;在该方法的执行时须要消耗CPU时间且在执行完该方法后才会从新执行回收操做,即至少须要垃圾回收器对该对象执行两次GC。
可能形成该对象的再次“复活”:
在finalize()方法中,若是有其它的强引用再次持有该对象,则会致使对象的状态由“收集阶段”又从新变为“应用阶段”。这个已经破坏了Java对象的生命周期进程,且“复活”的对象不利用后续的代码管理。

6. 终结阶段

当对象执行完finalize()方法后仍然处于不可达状态时,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收。

7.对象空间从新分配阶段

垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象完全消失了,称之为“对象空间从新分配阶段”。

关于垃圾回收机制可见Java 垃圾回收机制

所以当实例化子类时会默认隐式递归调用父类中的构造方法。文章最开始的代码至关于:

public class A {
    double a;
    double b;
    A(){
        a = -1;
        b = -1;
    }
}

class B extends A{
    private double c;

    B(){
        super();
        c = -1;
    }
}

class Demo{
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        System.out.println(b.a);
    }
复制代码

欢迎加入学习交流群569772982,你们一块儿学习交流。

相关文章
相关标签/搜索