java中在创建对象时候的初始化顺序

本文详细解析了Java中创建对象时的初始化顺序,包括静态初始化块、非静态初始化块及构造器的执行流程,并通过示例代码展示了在不同场景下的初始化顺序。重点分析了静态初始化与继承之间的关系,以及多态情况下对象初始化的特殊行为。
摘要由CSDN通过智能技术生成

    最近由于工作空闲时间较多(不是酱油哦),闲暇之余,想多学习点java的基础知识。目的嘛,说的大点,就是增加自己的知识的深度。因为目前java的开发人员,很多都处于一个很低层次的水平,完全的code+copy,缺乏对基础知识的掌握,也就完全成为了“码工”,很有必要对基础知识充充电,在以后换工作,面试的时候也许让面试官刮目相看,至少让别人看到了你不只是会code,还有对java的基础理解,面向对象的理解。废话不多说了,进入正题。
    今天想说说java在创建对象的时候的初始化顺序,其实大家如果笔试,或者面试的时候,经常会遇到一些初始化的问题,反正我是遇到过。今天我们就来看看。

    先看下我写的几个示例类,一个父类,一个子类继承这个父类,最简单的模式。

/**父类*/
package test;
public class Father {
	static
	{ System.out.println("父类静态初始化块");}
	{ System.out.println("父类初始化块");      }
	private static int b = 1;
	public Father() {
		System.out.println("调用了父类无参构造器");
	}
	public Father(int b) {
		this.b = b;
		System.out.println("调用父类的有参构造器");
	}
}
/**子类*/
package test;
public class Son extends Father {
	static
	{ System.out.println("子类静态初始化块"); }
	{ System.out.println("子类初始化块");       }
	private static int a =1;
	public Son() {
		System.out.println("调用子类的构造器");
	}
	public Son(int a){
		this.a=a;
		System.out.println("调用子类的有参构造器");
	}
}

  •    单独的一个对象初始化,不含继承和其他情况
package test;
public class Test {

	public static void main(String[] args) {
		Father father = new Father();
	}
}

 

    打印的结果为:

    父类静态初始化块

    父类初始化块

    调用了父类无参构造器

 

    我们来分析下,大家都知道静态对象(包括静态块,静态方法,静态属性),都是和类相关联的。当第一次创建对象的时候,首先初始化的应该是静态对象,然后才是非静态对象,最后才是构造器去创建实例。所以大致的顺序应该是:静态对象-非静态对象-构造器。那么在静态对象或者非静态对象中是否也存在一个什么顺序呢?经过测试,我们发现其实在同等的优先级的情况下,是按照声明的顺序初始化的。

  • 包含继承的子类初始化

下面讨论另外一个问题,设计到继承的问题,我们现在创建Son对象,他会执行父类的一些初始化么,他和子类的一些初始化之间又存在什么关联呢?

 

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

   打印语句:

    父类静态初始化块

   子类静态初始化块

   父类初始化块

   调用了父类无参构造器

   子类初始化块

   调用子类的构造器

  打印语句告诉了我们,静态对象依然是第一个初始化的,然后呢?就是父类中的非静态对象-构造器,子类中的非静态对象-构造器。

  • 包含继承和多态的子类初始化

  再看如果是多态的情况下会有什么情况出现呢?

 

package test;

public class Test {

	public static void main(String[] args) {
		Father father = new Son();
	}
}

 打印语句:

     父类静态初始化块

     子类静态初始化块

     父类初始化块

     调用了父类无参构造器

     子类初始化块

     调用子类的构造器

和前面继承的情况完全一样,这里不再啰嗦了。

 

总的一个结论就是:静态对象总是在第一次创建对象前就已经初始化完毕,初始化的顺序从最顶端的父类到子类,只会初始化一次。然后就是从父类到子类中,依次初始化非静态对象和构造器。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值