java中构造函数在继承中的调用顺序是什么?

本文详细解释了Java中子类对象创建时,构造函数的调用顺序,包括父类静态/实例变量初始化、静态初始化块和构造函数的执行顺序。通过实例演示,清晰展示了构造函数在继承中的调用规律。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Java中,当创建子类对象时,构造函数的调用顺序遵循以下规则:

  1. 父类的静态变量和静态初始化块:首先,Java会加载父类,并执行父类中的静态变量初始化和静态初始化块(静态代码块)。这只会在类首次被加载到JVM时执行一次。
  2. 子类的静态变量和静态初始化块:接下来,Java会加载子类,并执行子类中的静态变量初始化和静态初始化块。
  3. 父类的实例变量和实例初始化块:当创建子类对象时,Java会首先调用父类的构造函数。在父类构造函数执行之前,父类的实例变量会被初始化(如果有显式初始化),然后执行父类的实例初始化块(如果有)。
  4. 父类的构造函数:之后,父类的构造函数会被执行。
  5. 子类的实例变量和实例初始化块:在父类构造函数执行完毕后,子类的实例变量会被初始化(如果有显式初始化),然后执行子类的实例初始化块(如果有)。
  6. 子类的构造函数:最后,子类的构造函数会被执行。

这个过程确保了父类在子类之前被完全初始化,这样子类就可以安全地访问父类的任何非静态成员。

以下是一个简单的例子来展示这个过程:

class Parent {  
    static {  
        System.out.println("Parent static block");  
    }  
  
    {  
        System.out.println("Parent instance block");  
    }  
  
    public Parent() {  
        System.out.println("Parent constructor");  
    }  
}  
  
class Child extends Parent {  
    static {  
        System.out.println("Child static block");  
    }  
  
    {  
        System.out.println("Child instance block");  
    }  
  
    public Child() {  
        System.out.println("Child constructor");  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        new Child();  
    }  
}

输出结果为:

Parent static block  
Child static block  
Parent instance block  
Parent constructor  
Child instance block  
Child constructor

这个输出清楚地展示了构造函数在继承中的调用顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值