Java类加载初始化的过程及顺序

 更新时间:2018年12月24日 08:33:37   作者:pigdreams  
今天小编就为大家分享一篇关于Java类加载初始化的过程及顺序,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

Java类的加载说明

  • Java类的编译代码都存在于它自己的独立文件中(class),该文件只在需要使用程序代码时才会被加载。
  • 类加载在创建类的第一个对象时发生,但当访问static域或static方法时,也会发生加载。
  • 构造器也是static方法,尽管static关键字没有显式写出,故可进一步说,类是在任何static成员被访问时加载的。

示例说明加载过程

示例源于《Java编程思想》

//父类
public class SuperClass {
  protected int super_a;
  private int super_b=9;
  protected static int super_x=printStr("SuperClass static init super_x");
  public SuperClass(){
    System.out.println("Super Class Constructor action.... ");
    System.out.println("super_a="+super_a);
    System.out.println("super_b="+super_b);
    super_a=33;
  }
  static int printStr(String string){
    System.out.println(string);
    return 47;
  }
}
//子类
public class SubClass extends SuperClass{
  private static int sub_b=printStr("SubClass static init sub_b");
  public SubClass(){
    System.out.println("Sub Class Constructor action.... ");
    System.out.println("Sub Class super_a="+super_a);
    System.out.println("Sub Class sub_b="+sub_b);
  }
}
//程序入口,执行代码
  public static void main(String[] args) {
    SubClass subClass=new SubClass();
  }

###执行结果

SuperClass static init super_x
SubClass static init sub_b
Super Class Constructor action.... 
super_a=0
super_b=9
Sub Class Constructor action.... 
Sub Class super_a=33
Sub Class sub_b=47

由结果得出类的加载过程与顺序

  • 如果一个类有父类,则父类会先被加载。Static变量会优先被初始化执行,先初始化父类的super_x,再初始化子类的sub_b。
  • 所有非静态成员变量都会赋于一个默认值,如果是基本类型则为默认值,如果是对象引用则为null,这是通过将对象内存设为二进制零值而一举生成的。
  • 调用父类构造函数,但先不执行里面的代码。父类的非静态成员变量会被赋值,即是执行=号右边内容,将9赋值给super_b.
  • 执行父类的构造函数里的代码。
  • 子类的非静态成员变量赋于默认值。
  • 执行子类构造函数里的代码。

加载过程流程图

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • 详解Spring Boot 集成Shiro和CAS

    详解Spring Boot 集成Shiro和CAS

    这篇文章主要介绍了详解Spring Boot 集成Shiro和CAS,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java与WebUploader相结合实现文件上传功能(实例代码)

    Java与WebUploader相结合实现文件上传功能(实例代码)

    这篇文章主要介绍了Java结合WebUploader实现文件上传功能,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • Mybatisplus主键生成策略算法解析

    Mybatisplus主键生成策略算法解析

    这篇文章主要介绍了Mybatisplus主键生成策略算法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Java之Spring注解开发案例详解

    Java之Spring注解开发案例详解

    这篇文章主要介绍了Java之Spring注解开发案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • SpringMVC之异常处理解读

    SpringMVC之异常处理解读

    这篇文章主要介绍了SpringMVC之异常处理解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 为什么wait和notify必须放在synchronized中使用

    为什么wait和notify必须放在synchronized中使用

    这篇文章主要介绍了为什么wait和notify必须放在synchronized中使用,文章围绕主题的相关问题展开详细介绍,具有一定的参考价值,需要的小伙伴可以参考以参考一下
    2022-05-05
  • Java浅析代码块与构造块及静态块三者之间的关系

    Java浅析代码块与构造块及静态块三者之间的关系

    所谓代码块是指用"{}"括起来的一段代码,根据其位置和声明的不同,可以分为普通代码块、构造块、静态块、和同步代码块。如果在代码块前加上synchronized关键字,则此代码块就成为同步代码块
    2022-07-07
  • Spring Boot 2.6.x整合Swagger启动失败报错问题的完美解决办法

    Spring Boot 2.6.x整合Swagger启动失败报错问题的完美解决办法

    这篇文章主要给大家介绍了关于Spring Boot 2.6.x整合Swagger启动失败报错问题的完美解决办法,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • feign远程调用无法传递对象属性405的问题

    feign远程调用无法传递对象属性405的问题

    这篇文章主要介绍了feign远程调用无法传递对象属性405的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java 基于AQS实现一个同步器

    Java 基于AQS实现一个同步器

    这篇文章主要介绍了如何基于AQS实现一个同步器,帮助大家更好的理解和学习Java并发,感兴趣的朋友可以了解下
    2020-09-09

最新评论