Java类的初始化顺序的实现

 更新时间:2023年12月06日 14:40:05   作者:无问287  
类的初始化过程是在类加载阶段完成的,包括加载、验证、准备、解析和初始化等步骤,本文主要介绍了Java类的初始化顺序的实现,感兴趣的可以了解一下

类初始化顺序遵循以下三个原则(优先级依次递减)

1、静态对象(变量)优先于非静态对象(变量)初始化,其中静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次;

2、父类优先于子类初始化;

3、成员变量按照定义先后顺序进行初始化;

例如:静态变量、非静态变量、静态代码块、非静态代码块、构造函数、父类、子类等。

他们的初始化顺序是:父类静态变量 > 父类静态代码块 > 子类静态变量 > 子类静态代码块 > 父类非静态变量 > 父类非静态代码块 > 父类构造函数 > 子类非静态变量 > 子类非静态代码块 > 子类构造函数。 

1.对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序是?

public class Test1 {
	// 静态变量
	public static String staticField = "静态变量";
	// 变量
	public String field = "变量";
	// 静态初始化块
	static {
	  System.out.println(staticField);
	  System.out.println("静态初始化块");
	}
	// 初始化块
	{
	  System.out.println(field);
	  System.out.println("初始化块");
	}
	// 构造器
	public Test1() {
	 System.out.println("构造器");
	}
	public static void main(String[] args) {
	 new Test1();
	}
}

执行结果如下:

2.在继承场景下,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺是?

class Parent { 
	 // 静态变量
	 public static String p_StaticField = "父类--静态变量";
	 // 变量
	 public String p_Field = "父类--变量";
	 // 静态初始化块
	 static {
	   System.out.println(p_StaticField);
	   System.out.println("父类--静态初始化块");
	 }
	 // 初始化块
	 {
	   System.out.println(p_Field);
	   System.out.println("父类--初始化块");
	 }
	 // 构造器
	 public Parent() {
	   System.out.println("父类--构造器");
	 }
}
public class Test2 extends Parent {
	 // 静态变量
	 public static String s_StaticField = "子类--静态变量";
	 // 变量
	 public String s_Field = "子类--变量";
	 // 静态初始化块
	 static {
	   System.out.println(s_StaticField);
	   System.out.println("子类--静态初始化块");
	 }
	 // 初始化块
	 {
	   System.out.println(s_Field);
	   System.out.println("子类--初始化块");
	 }
	 // 构造器
	 public Test2() {
	   System.out.println("子类--构造器");
	 }
	 // 程序入口
	 public static void main(String[] args) {
	   new Test2();
	 }
}

 执行结果如下:

3.静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢? 

public class Test3 {
// 静态变量
public static TestA a = new TestA();
// 静态初始化块
static {
   System.out.println("静态初始化块");
}
// 静态变量
public static TestB b = new TestB();
	public static void main(String[] args) {
		new Test3();
	}
}
class TestA {
	public TestA() {
		System.out.println("Test--A");
	}
}
class TestB {
	public TestB() {
		System.out.println("Test--B");
	}
}

执行结果如下:

到此这篇关于Java类的初始化顺序的实现的文章就介绍到这了,更多相关Java类初始化顺序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot通过@MatrixVariable进行传参详解

    SpringBoot通过@MatrixVariable进行传参详解

    这篇文章主要介绍了SpringBoot使用@MatrixVariable传参,文章围绕@MatrixVariable展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • JavaWeb Listener 利用Session统计在线人数

    JavaWeb Listener 利用Session统计在线人数

    这篇文章主要为大家介绍了JavaWeb Listener 利用Session统计在线人数,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • SpringBoot项目启动报错踩坑实战记录

    SpringBoot项目启动报错踩坑实战记录

    这篇文章主要给大家介绍了关于SpringBoot项目启动报错踩坑的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • Spring注解@Profile实现开发环境/测试环境/生产环境的切换

    Spring注解@Profile实现开发环境/测试环境/生产环境的切换

    在进行软件开发过程中,一般会将项目分为开发环境,测试环境,生产环境。本文主要介绍了Spring如何通过注解@Profile实现开发环境、测试环境、生产环境的切换,需要的可以参考一下
    2023-04-04
  • Java中Stream流去除List重复元素的方法

    Java中Stream流去除List重复元素的方法

    这篇文章主要为大家详细介绍了Java中Stream流去除List重复元素的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Mybatis基于注解与XML开发使用流程

    Mybatis基于注解与XML开发使用流程

    MyBatis是Java的持久化框架,目的是为了使操作数据库更加方便、灵活、高效,可以通过Java注解和XML文件来映射Java对象和SQL语句,提供了非常灵活的SQL编写方式和动态SQL语句的创建方式,这篇文章主要介绍了Mybatis基于注解与XML开发,需要的朋友可以参考下
    2023-07-07
  • java springboot poi 从controller 接收不同类型excel 文件处理

    java springboot poi 从controller 接收不同类型excel 文件处理

    这篇文章主要介绍了java springboot poi 从controller 接收不同类型excel 文件处理,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • java实现word文档转pdf并添加水印的方法详解

    java实现word文档转pdf并添加水印的方法详解

    这篇文章主要介绍了java实现word文档转pdf并添加水印的方法,结合实例形式详细分析了java word文档转PDF相关实现技巧与操作注意事项,需要的朋友可以参考下
    2019-09-09
  • MyBatis连接池的深入和动态SQL详解

    MyBatis连接池的深入和动态SQL详解

    这篇文章主要介绍了MyBatis连接池的深入和动态SQL详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 深入理解Java编程中异常处理的优劣

    深入理解Java编程中异常处理的优劣

    本篇文章是对Java编程中异常处理的优劣进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论