静态代码块、构造代码块、构造方法在初始化子类对象时的执行顺序

本文详细解析了Java中子类对象初始化的过程,包括类加载、父类与子类静态及非静态初始化域的执行顺序,以及构造函数的调用流程。通过具体代码示例,阐述了子类构造器中隐式super()调用的重要性。

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

在这里插入图片描述
图片中所示代码的输出是?

答:
base static
sub static
base构造代码块
base构造函数
sub构造代码块
sub构造函数

  1. 创建子类对象之前,首先执行类加载过程
    先加载父类,于是父类中的静态代码块的代码先执行

  2. 父类加载完毕后,开始加载子类,于是子类静态代码块代码后执行

  3. 类加载过程完毕后,首先初始化父类对象,所以首先执行父类中的
    构造代码块,在执行父类中的构造方法

  4. 然后在初始化子类成员,执行子类的构造代码块,子类的构造方法

子类和父类的执行顺序说明:

父类的静态初始化域,

子类的静态初始化域,

父类的非静态初始化域,

父类的构造函数,

子类的非静态初始化域,

子类的构造函数。

注意:初始化子类,但父类还没有初始化时,会先触发父类初始化
要特别注意子类在执行构造器时一定会先执行一个隐式的super()

这意味着子类调用构造器时要先执行父类的无参数构造器对父类进行初始化,如果父类没有无参构造器,则会出现编译错误,直接报错

这个过程的例子:


class Father
{   
    Father(){};
}
class Child extends Father
{
    super(); //隐式地调用父类构造函数,对父类进行初始化
    int age = 10; 
    Child(){};
}

若执行Child child = new Child();

(1)首先进行类加载(如果是首次使用这两个类),依次把父类和子类加载,对父类、子类变量进行初始化(int age=0);

(2)执行子类Child构造函数中的隐式super(),调用父类构造函数对父类进行初始化;

(3)执行子类Child构造函数中的其余部分,对子类进行初始化;

(4)对子类变量进行初始化(child.age = 10)

Java中子类对象初始化的过程参见:
https://blog.youkuaiyun.com/yangruijie1123/article/details/62948869

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值