首页 > 其他分享 >4 类的生命周期

4 类的生命周期

时间:2024-03-05 15:44:21浏览次数:21  
标签:初始化 生命周期 静态 System static println public

4 类的生命周期

​ 类的生命周期描述了一个类加载、使用、卸载的整个过程

​ 类的生命周期包括五个阶段:加载、连接、初始化、使用、卸载

  • 加载

    • 加载阶段第一步是类加载器根据类的全限定名通过不同的渠道(本地文件、动态代理生成等)以二进制流的方式获取字节码信息
    • 类加载器在加载完类之后,java虚拟机会将字节码中的信息保存到方法区中。生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能,比如:多态的信息
    • java虚拟机还会在中生成一份与方法区中数据类似的java.lang.Class对象静态字段会保存在中(JDK1.8以后)
    • 在堆中生成的Class对象的好处:开发者不需要去访问方法区,访问Class对象即可,方法区中的信息更多
  • 连接

    • 验证

      验证内容是否符合jvm规范

    • 准备

      给静态变量赋初始值不是给它赋自己定义的值

      例如:public static int i = 2;,在准备阶段的时候,栈中的i的值赋予了初始值0,还没有赋值2

      但如果是用了final修饰,在准备阶段就直接赋了自己定义的值。

    • 解析

      将常量池中的符号引用替换成指向内存的直接引用

  • 初始化重要,程序员可以干涉)

    • 初始化阶段会执行静态代码块中的代码,并为静态变量赋值

    • 初始化阶段会执行字节码文件中的clinit部分的字节码指令

    • 以下几种方式会导致类的初始化:

      • 1.访问一个类的静态变量或者静态方法,注意变量是final修饰的并且等号右边是常量不会触发初始化
      • 2.调用Class.forName(String className)
      • 3.new一个该类的对象时
      • 4.执行Main方法的当前类

      例:

      public class Test2 {
      
      public static void main(String[] args) {
        System.out.println("A");
        new Test2();
        new Test2();
      }
      
      public Test2(){
        System.out.println("B");
      }
      
      {
        System.out.println("C");
      }
      static {
        System.out.println("D");
      }
      }
      //输出结果为:
      D
      A
      C
      B
      C
      B
      
    • 以下几种情况不会初始化

      • 1.无静态代码块且无静态变量赋值语句
      • 2.有静态变量的声明,但是没有赋值语句
      • 3.静态变量的定义使用final关键字,这类变量会在准备阶段直接进行初始化
    • 父类和子类的初始化

      • 直接访问父类的静态变量,不会触发子类的初始化子类的
      • 初始化clinit调用之前,会先调用父类的clinit初始化方法
    • 数组的创建不会导致数组中元素的类进行初始化

    //数组的创建不会导致数组中元素的类进行初始化
    public class TestArrayInit {
    
    public static void main(String[] args) {
      TestArrayInit_A[] arr = new TestArrayInit_A[10];
    }
    }
    
    class TestArrayInit_A {
    static {
      System.out.println("TestArrayInit_A的静态代码块运行");
    }
    }
    
    • final修饰的变量如果赋值的内容需要执行指令才能得出结果,会执行clinit方法进行初始化
    public class TestFinalInit {
    public static void main(String[] args) {
      System.out.println(TestFinalInit_A.a);
    }
    }
    
    class TestFinalInit_A{
    public static final int a = Integer.valueOf(1);
    static {
      System.out.println("静态代码块运行了");
    }
    }
    //输出结果:
    静态代码块运行了
    1
    
  • 结合类连接和初始化阶段思考以下两个案例:

public class HSDBDemo {

static {
  i = 10;
}

public static int i=2;

public static void main(String[] args) throws IOException {
  HSDBDemo hsdbDemo = new HSDBDemo();
  //输出结果位2
  System.out.println(i);   
}
}
public class HSDBDemo {

static {
  i = 10;
}

public static int i;

public static void main(String[] args) throws IOException {
  HSDBDemo hsdbDemo = new HSDBDemo();
  //输出结果为10
  System.out.println(i);
}
}
  • 使用

  • 卸载

标签:初始化,生命周期,静态,System,static,println,public
From: https://www.cnblogs.com/miaoyindian/p/18054202

相关文章

  • UE5 Gameplay一些类的生命周期备忘
    作为一个初学者,尽管能够在UE中能够使用蓝图和简单在C++中做一些逻辑更改,但对 Gameplay框架的使用上还是一脸懵逼,比如:玩家的本地数据存在哪里?游戏的数据存在哪?如果我切换了关卡,放在哪的数据会丢?如果玩家死亡了,放在哪的数据会丢?如果我想要存储一个全局数......
  • Bean创建的生命周期
    Bean创建的生命周期((20231222181259-yw9e73s'Spring的三级缓存机制:'))User.class->无参构造器->user对象(属性无赋值)->DI(依赖注入),这里通常使用@Autowired为属性赋值->初始化前(PostConstruct)->初始化(InitializingBean)->初始化后(AOP)->代理对象->userB......
  • 链码的生命周期
    链码的生命周期Fabric链码的生命周期是一个过程,允许多个组织在使用一个链码之前就如何操作这个链码来达成一致。fabric的生命周期可以用来展开以下任务:安装和定义链码升级链码部署场景迁移到新的Fabric生命周期安装以及定义链码打包链码(可以被一个或者每个组织完成)安......
  • go: 协程生命周期控制
    go:协程生命周期控制原创 王义杰 运维开发王义杰 2024-02-2822:27 广东 听全文在go开发中,如果我们希望在一定条件下,比如执行了某些任务后,主动结束其它相关的协程,可以通过使用context包来实现。context包允许我们发送取消信号给一个或多个协程,这样我们就可以控制协......
  • Vue Router系列之(十一)两个新的生命周期钩子
    两个新的生命周期钩子​ 缓存路由组件和定时器一起使用时,如果进行了路由跳转,本应触发在beforeDestroy钩子中清除定时器方法,但因为缓存了路由组件,就导致原来的路由组件的beforeDestroy钩子不会被触发,定时器也就不会清除作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态......
  • Vue 2x 系列之(十八)生命周期
    生命周期[函数]......
  • Vue2.x生命周期函数
    介绍Vue.js2.x中的生命周期函数是一系列钩子函数,它们允许你在Vue实例的不同阶段执行代码。这些生命周期钩子函数允许你在特定的阶段添加自定义逻辑,以便在应用程序生命周期的不同点执行操作。创建阶段1)beforeCreate(创建前):在Vue实例初始化之后,数据观测(dataobs......
  • 学习之生命周期
    Servlet生命周期4.1生命周期简介什么是Servlet的生命周期应用程序中的对象不仅在空间上有层次结构的关系,在时间上也会因为处于程序运行过程中的不同阶段而表现出不同状态和不同行为——这就是对象的生命周期。简单的叙述生命周期,就是对象在容器中从开始创建到销毁的过程。......
  • 质量保障体系的生命周期
    有同学在公众号后台留言,问了这样一个问题:搭建质量保障体系,有没有从零到十的落地步骤,比如在项目的不同阶段该侧重哪些方面?老实说,这个问题让我眼前一亮,这段时间难得的一个好问题。互联网上的技术文章大多分两种类型:一种是纯技术细节或者工具使用步骤,另一种则是高屋建瓴式的体系总......
  • 漫谈.net core和Autofac中的Scoped生命周期
      我们知道,.netcore内置了IOC容器,通常,一个服务的生命周期有三种:Transient、Scoped、Singleton  Transient:临时性的服务,当进行服务注入时,每次都是重新创建一个新的对象实例Scoped:范围性的服务,当在一个范围内进行服务注入时,保证使用同一个实例对象(可以理解为一个ISer......