java 对象初始化的顺序

本文详细解析了Java中创建子类对象时成员变量初始化的顺序,包括默认值的设置及非默认值的初始化过程。

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

package org.hhb.objectinit;

class Father {
	static {
		System.out.println("Father static block!");
	}
	public Father() {
		System.out.println(this);
		System.out.println(((Sub) this).a);
	}
}
/**
 * 
 * @author hehaibo
 *
 */
public class Sub extends Father {
	static {
		System.out.println("Sub static block!");
	}
	public int a = 100;

	public Sub() {
		super();
		System.out.println(this);
		System.out.println(a);
		a = 200;
	}

	public static void main(String[] args) {
		System.out.println(new Sub().a);

	}
}

 

输出结果:
1 Father static block!
2 Sub static block!
3 Father this object::org.hhb.objectinit.Sub@19ee1ac
4 0
5 Sub this object::org.hhb.objectinit.Sub@19ee1ac
6 100
7 200

   对象初始化的顺序:

 

    1 为Sub对象分配内存空间,

       初始化Sub对象的成员变量的默认值,而不是 a=100。

    2  调用Father类的构造函数,并且初始化Father成员变量的默认值

    3 调用Object类的构造函数,由jvm负责。

    4 打印第3行的输出结果我们可以看出,当前父类的构造函数的this就是Sub对象的引用地址,

       可以证明1是正确的。

    5 第4行输出的值是0,我们可以看出Sub对象初始化的时候成员变量的默认值。

    6 父类的构造函数调用完后,再次将Sub对象的a成员变量的默认初始值修改为100,所以第6行打印输出是100。

    7 再次执行a=200,main方法中输出200

 

 

    得出的结论是:构建子类对象的时候,所有的成员变量都是默认值,

                            而子类的成员变量的非默认值初始化[也就是a=100]是在父类执行完成后才执行的。

 

 

   参考:http://kenwublog.com/a-interesting-problem-about-java-object-init-order

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值