java初始化顺序

java初始化顺序

1、无继承情况下java初始化顺序

/**
 * 无继承情况下java初始化顺序:
 * @author nier_ni
 *
 */
public class NotExtendJava {
	public static void main(String[] args) {
		Text text = new Text();
	}
}
class ToPrint{
	ToPrint(String str){
		System.out.println(str);
	}
	ToPrint(){
		System.out.println("ToPrint默认构造函数被调用");
	}
}
class Text{
	static ToPrint str = new ToPrint("静态成员str初始化");
	ToPrint strtamp = new ToPrint("strtamp成员初始化");
	static{
		System.out.println("static块执行");
		if(str==null)
			System.out.println("str is null");
		str =  new ToPrint("static块内初始化str成员变量");
	}
	Text(){
		System.out.println("Text默认构造函数被调用");
	}
}

结果如下图所示:

得出结论:

a、静态成员变量首先被初始化。(注意:static就是静态成员,其执行顺序是按声明顺序初始化的)

b、static块执行。(注意:static块多个,按顺序执行)

c、普通成员变量。

d、被调用的构造函数。

对于静态成员(static块可以看成普通的一个静态成员,其并不一定在类初始化时首先执行)和普通成员,其初始化顺序只与类定义中的顺序由关,和其他因素无关。

/**
 * 无继承情况下java初始化顺序:
 * @author nier_ni
 *
 */
public class NotExtendJava {
	static{
		System.out.println("static 块  1 执行");
	}
	static ToPrint str1 = new ToPrint("静态成员str1初始化");
	ToPrint strtamp1 = new ToPrint("strtamp1成员初始化");
	static{
		System.out.println("static 块  2 执行");
	}
	static ToPrint str2 = new ToPrint("静态成员str1初始化");
	NotExtendJava(){
		System.out.println("NotExtendJava默认构造函数被调用");
	}
	ToPrint strtamp2 = new ToPrint("strtamp2成员初始化");
	public static void main(String[] args) {
		NotExtendJava notExtendJava = new NotExtendJava();
	}
}

结果如图所示:


2、继承情况下java初始化顺序:

/**
 * 继承情况下java初始化顺序:
 * @author nier_ni
 *
 */
public class ExtendJava {
	public static void main(String[] args) {
		SubText subText = new SubText();
	}
}
class Print{
	Print(String str){
		System.out.println(str);
	}
	Print(){
		System.out.println("ToPrint默认构造函数被调用");
	}
}
class SuperText{
	static Print str = new Print("父类静态成员str初始化");
	Print strtamp = new Print("父类成员strtamp初始化");
	static{
		System.out.println("父类static块初始化");
		if(str == null)System.out.println("str is null");
		str = new Print("父类static内部成员str初始化");
	}
	SuperText(){
		System.out.println("父类SuperText默认构造函数被调用");
	}
}
class SubText extends SuperText{
	static Print subStr  = new Print("子类SubText静态成员subStr初始化");
	Print subStrTamp = new Print("子类成员subStrTamp初始化");
	static{
		System.out.println("子类static块初始化");
		if(subStr == null)System.out.println("subStr is null");
		subStr = new Print("子类static内部成员subStr初始化");
	}
	SubText(){
		System.out.println("子类SubText默认构造函数被调用");
	}
}
结果如下图所示:

得出结论:

a、父类静态成员变量首先被初始化。(注意:static就是静态成员,其执行顺序是按声明顺序初始化的)

b、父类static块执行。(注意:static块多个,按顺序执行)

c、子类静态成员变量首先被初始化。(注意:static就是静态成员,其执行顺序是按声明顺序初始化的)

b、子类static块执行。(注意:static块多个,按顺序执行)

e、子类成员变量。

f、默认父类构造函数。

g、子类成员变量。

h、被调用的子类构造函数。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值