博客
关于我
java 中类的加载顺序
阅读量:111 次
发布时间:2019-02-26

本文共 1358 字,大约阅读时间需要 4 分钟。

Java 类的初始化与销毁机制是程序运行的重要组成部分,理解其工作原理对于优化程序性能至关重要。本文将从静态初始化、实例创建、类销毁等方面详细解析 Java 的类生命周期。

1. 静态初始化与类加载

在 Java 中,静态初始化是类加载的关键环节。第一次加载类时,Java 虚拟机(JVM)会执行以下步骤:

  • 静态成员变量初始化:将所有静态变量初始化为其定义时的值。
  • 静态初始化块:执行所有静态初始化块。这类似于类构造过程中执行初始化操作,但仅在类被首次加载时执行。
  • 静态方法调用:如果静态方法在类加载时被调用,则会立即执行这些方法。

例如,在 Parent 类中:

public static int t = parentStaticMethod2();{    System.out.println("父类非静态初始化块");}static{    System.out.println("父类静态初始化块");}

当 Parent 类被首次加载时,jvm 会执行父类的静态初始化块,并按顺序调用静态方法。

2. 实例创建与类初始化

当使用 new 运算符创建类实例时,类的实例创建过程遵循以下顺序:

  • 父类初始化
    • 执行父类的非静态初始化块。
    • 调用父类的构造方法(super())。
  • 子类初始化
    • 执行子类的非静态初始化块。
    • 调用子类的构造方法(this())。
  • 例如,Child 类继承 Parent 类:

    {    System.out.println("子类非静态初始化块");}

    当创建 Child 实例时,jvm 会先初始化 Parent 类的非静态部分,再初始化 Child 的非静态部分。

    3. 类销毁与内存管理

    类实例销毁时,JVM 会执行以下步骤:

  • 子类销毁:首先销毁子类的非静态部分。
  • 父类销毁:接着销毁父类的非静态部分。
  • 静态成员销毁:如果类没有任何实例存在,JVM 会销毁其静态成员变量和静态初始化块。
  • 例如,Parent 类的 finalize() 方法:

    @Overrideprotected void finalize() throws Throwable{    super.finalize();    System.out.println("销毁父类");}

    当 Child 实例被销毁时,JVM 会先调用 Child 的 finalize(),再调用 Parent 的 finalize()

    4. 实际应用示例

    通过 Test 类的 main 方法:

    public static void main(String[] args){    Parent.parentStaticMethod2();    Child child = new Child();}

    运行结果如下:

    父类的静态方法2父类静态初始化块父类的静态方法2子类静态初始化块父类非静态初始化块父类的构造方法子类非静态初始化块子类的构造方法

    这表明,类的初始化顺序是:

  • 父类静态初始化块
  • 子类静态初始化块
  • 父类非静态初始化块
  • 子类非静态初始化块
  • 父类构造方法
  • 子类构造方法
  • 通过以上分析,可以清晰地看出 Java 类的生命周期及其初始化和销毁的具体过程。理解这些机制有助于优化程序性能,避免内存泄漏和资源浪费。

    转载地址:http://wbof.baihongyu.com/

    你可能感兴趣的文章
    Papyrus项目常见问题解决方案
    查看>>
    Parallel.ForEach使用示例
    查看>>
    Parallel.ForEach的基础使用
    查看>>
    parallels desktop for mac安装虚拟机 之parallelsdesktop密钥 以及 parallels desktop安装win10的办公推荐可以提高办公效率...
    查看>>
    parallelStream导致LinkedList遍历时空指针的问题
    查看>>
    Parameter ‘password‘ not found. Available parameters are [md5String, param1, username, param2]
    查看>>
    ParameterizedThreadStart task
    查看>>
    Spring security之管理session
    查看>>
    paramiko模块
    查看>>
    param[:]=param-lr*param.grad/batch_size的理解
    查看>>
    spring mvc excludePathPatterns失效 如何解决spring拦截器失效 excludePathPatterns忽略失效 拦截器失效 spring免验证拦截器不起作用
    查看>>
    Spring Cloud 之注册中心 EurekaServerAutoConfiguration源码分析
    查看>>
    Parrot OS 6.2 重磅发布!推出全新 Docker 容器启动器
    查看>>
    Parrot OS 6.3 发布!全面提升安全性,新增先进工具,带来更高性能
    查看>>
    ParseChat应用源码ios版
    查看>>
    Part 2异常和错误
    查看>>
    Pascal Script
    查看>>
    Spring Boot集成Redis实现keyspace监听 | Spring Cloud 34
    查看>>
    Spring Boot中的自定义事件详解与实战
    查看>>
    Passport 密码模式
    查看>>