Java类的初始化顺序

闲话不多说,直接上代码

Base父类

package com.gjp.Init;

public class Base {
	//静态变量
	private static int a = 10;

	//静态代码块
	static {
		System.out.println("Base静态代码块执行,a=" + a);
		staticMethod();
	}

	//静态方法
	private static void staticMethod() {
		System.out.println("Base静态方法执行");
	}

	//构造代码块
	{
		System.out.println("Base构造代码块执行");
		method();
	}

	//非静态变量
	private int b = 100;
	//构造方法
	public Base() {
		System.out.println("Base构造函数执行,b=" + b);
	}
	
	//非静态函数
	private void method() {
		System.out.println("Base非静态方法在构造代码块中执行执行");
	}
}


Child子类

package com.gjp.Init;

public class Child extends Base{
	//静态变量
		private static int a = 10;

		//静态代码块
		static {
			System.out.println("Child静态代码块执行,a=" + a);
			staticMethod();
		}

		//静态方法
		private static void staticMethod() {
			System.out.println("Child静态方法执行");
		}

		//构造代码块
		{
			System.out.println("Child构造代码块执行");
			method();
		}

		//非静态变量
		private int b = 100;
		//构造方法
		public Child() {
			System.out.println("Child构造函数执行,b=" + b);
		}
		
		//非静态函数
		private void method() {
			System.out.println("Child非静态方法在构造代码块中执行");
		}
}

Main函数

package com.gjp.Init;

public class Demo {
	public static void main(String[] args) {
		Child c = new Child();
	}
}

输出结果如下:

Base静态代码块执行,a=10
Base静态方法执行
Child静态代码块执行,a=10
Child静态方法执行
Base构造代码块执行
Base非静态方法在构造代码块中执行执行
Base构造函数执行,b=100
Child构造代码块执行
Child非静态方法在构造代码块中执行
Child构造函数执行,b=100

从输出结果可以看出,类的初始化,首先会找到最顶层的父类,并先初始化静态变量和静态方法,为什么呢?可以从第一行输出的变量a和静态方法看出,如果没有先初始化静态变量和静态方法,那么在写代码的时候IDE就会报错,而且a的值也会是0

所以首先执行的顺序是:

父类静态变量->父类静态方法->父类静态代码块


好了,往下看,会看到Child字样,没错,父类和static相关的都初始化成功之后,就该子类了,顺序和父类没区别

顺序如下:

子类静态变量->子类静态方法->子类静态代码块


继续往下看,又看到Base字样,这时就是初始化父类的构造代码块了,然后看上面的代码可以看出,非静态函数可以在构造代码块中执行,而这时可能你会问,非静态变量呢? 是的我没有在构造代码块中输出b的值,是因为在构造代码块中调用非静态变量,IDE会提示:Cannot reference a field before it is defined这个错误,意思大概是不能引用未定义的字段也就是变量,继续往下,看到构造函数执行,此时的b成功打印出来,值也为100,可以推断出变量是紧接着构造代码块初始化的,否则在构造函数中是无法调用的,就算能调用,值也是0。

由此得出顺序:

(在这里我不知道非静态函数为什么能在构造代码块中执行,我猜想的应该是在构造代码块之前初始化,或者直接入堆不需要初始化,还请知道的人告知我一下,在此谢过~)

父类非静态函数->父类构造代码块->父类非静态成员变量->父类构造函数


好了往下看Child和父类的初始化顺序基本一致

顺序如下:

子类非静态函数->子类构造代码块->子类非静态成员变量->子类构造函数


上面已经分析的很详细了,得出最终类的初始化顺序结论:

父类静态变量->父类静态方法->父类静态代码块
子类静态变量->子类静态方法->子类静态代码块
父类非静态函数->父类构造代码块->父类非静态成员变量->父类构造函数
子类非静态函数->子类构造代码块->子类非静态成员变量->子类构造函数

这个是我自己分析的,如果有经验者,我哪里写错了,请给我留言,让我纠正
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值