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几种任务的整合方法

    Springboot几种任务的整合方法

    这篇文章主要介绍了Springboot几种任务的整合方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java多线程之线程的创建

    Java多线程之线程的创建

    这篇文章主要介绍了Java多线程之线程的创建,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 如何用Java实现.env文件读取敏感数据

    如何用Java实现.env文件读取敏感数据

    这篇文章主要介绍了如何用Java实现.env文件读取敏感数据,并提供了一个自动配置类EnvAutoConfiguration,common-env-starter-demo模块展示了如何配置和启动一个简单的Spring Boot应用程序,需要的朋友可以参考下
    2025-02-02
  • Spring-AOP自动创建代理之BeanNameAutoProxyCreator实例

    Spring-AOP自动创建代理之BeanNameAutoProxyCreator实例

    这篇文章主要介绍了Spring-AOP自动创建代理之BeanNameAutoProxyCreator实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Springboot整合ip2region实现用户ip归属地获取

    Springboot整合ip2region实现用户ip归属地获取

    ip2region是一个离线IP地址定位库和IP定位数据管理框架,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现,下面我们来看看如何使用ip2region实现用户ip归属地获取吧
    2025-05-05
  • MyBatis中调用存储过程和函数的实现示例

    MyBatis中调用存储过程和函数的实现示例

    在MyBatis中调用存储过程和函数是一个相对高级的特性,本文主要介绍了MyBatis中调用存储过程和函数的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • SVN 安装教程之服务器和客户端

    SVN 安装教程之服务器和客户端

    这篇文章主要介绍了SVN 安装教程之服务器和客户端的相关资料,这里对安装步骤进行了详细介绍,需要的朋友可以参考下
    2016-11-11
  • Java使用设计模式中的代理模式构建项目的实例展示

    Java使用设计模式中的代理模式构建项目的实例展示

    这篇文章主要介绍了Java使用设计模式中的代理模式构建项目的实例展示,代理模式中的代理对象可以在客户端和目标对象之间起到中介的作用,需要的朋友可以参考下
    2016-05-05
  • Mybatis-Plus-Join表连接插件集成过程

    Mybatis-Plus-Join表连接插件集成过程

    Mybatis-Plus-Join是Mybatis-Plus的扩展插件,支持左、右、内连接查询,保持原有开发风格,通过JoinLambdaWrapper配置连接关系与查询条件,简化多表关联操作,提升复杂SQL编写效率
    2025-09-09
  • java的arraylist排序示例(arraylist用法)

    java的arraylist排序示例(arraylist用法)

    这篇文章主要介绍了java的arraylist排序示例,学习一下arraylist的用法,需要的朋友可以参考下
    2014-03-03

最新评论