Java类加载执行顺序

简要记录类的加载执行顺序:

先说结论:
父类静态(块/变量)–>子类静态(块/变量)–>父类普通(变量/块)–>父类构造器–>子类普通(变量/块)–>子类构造器

具体执行过程:

  1. 程序先找到main函数,不管此时有没有使用new进行创建对象,都会将涉及到的类(例如父类)进行类加载;
  2. 发现Son类有一个父类Father类;
  3. 初始化有关Father类的静态变量与静态块(顺序依据书写的顺序执行);
  4. 初始化有关Son类的静态变量与静态块(顺序依据书写的顺序执行);
  5. 全部静态初始完毕,以上过程都是创建对象之前执行,且仅执行一次;
  6. 创建Son类对象son1;
  7. 初始化父类普通块与普通变量(顺序依据书写的顺序执行);
  8. 初始化父类构造器;
  9. 初始化子类普通块与普通变量(顺序依据书写的顺序执行);
  10. 初始化子类构造器;
  11. Son类对象son2同son1;

父类:

package test.loadSort;

public class Father {
	
	public static String str1 = println("父类静态变量1");
	static {
		//System.out.println("父类静态块2");
		println("父类静态块2");
	}
	
	{
		println("父类普通块1");
	}
	
	public String str2 = println("父类普通变量2");
	
	public static String str3 = println("父类静态变量3");
	
	public Father() {
		println("父类构造器3");
		// System.out.println("父类构造器5");
	}
	
	public static String println(String str) {
		System.out.println(str);
		return str;
	}
}

子类:

package test.loadSort;

public class Son extends Father{

	public static String str1 = println("子类静态变量1");
	
	{
		println("子类普通块1");
	}
	public String str2 = println("子类普通变量2");
	
	static {
		//System.out.println("父类静态块2");
		println("子类静态块2");
	}
	
	public Son() {
		println("子类构造器3");
		// System.out.println("父类构造器5");
	}
	public static String str3 = println("子类静态变量3");
	
	
	public static void main(String[] args) {
		System.out.println("--------静态只执行一次--------");
		Son son1 = new Son();
		System.out.println("*******普通根据new次数执行*********");
		Son son2 = new Son();
		
	}
}

执行结果:

父类静态变量1
父类静态块2
父类静态变量3
子类静态变量1
子类静态块2
子类静态变量3
--------静态只执行一次--------
父类普通块1
父类普通变量2
父类构造器3
子类普通块1
子类普通变量2
子类构造器3
*******普通根据new次数执行*********
父类普通块1
父类普通变量2
父类构造器3
子类普通块1
子类普通变量2
子类构造器3
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值