zoukankan      html  css  js  c++  java
  • 分析java类的初始化契机

    分析java类的静态成员变量初始化先于非静态成员变量

     

    依上图中当class字节码文件被jvm虚拟机加载到内存中依次经过

    • 连接
      •   验证:对字节码进行验证
      •   准备:给静态变量分配内存并赋予变量类型各自的默认值(注:基本类型为0或false,对象为null,static final修饰的常量直接赋予相应的值)
      •   解析:类中符号引用转换成直接引用
    • 初始化:为类的静态变量/静态语句块初始化相应的值
    • 使用:   为类的非静态变量/非静态语句块初始化相应的值

    类的初始化契机是:类在被第一次主动使用的情况下,主动使用包括以下6中情况:

    1. 使用new关键字实例化对象时。
    2. 调用个类的静态方法时
    3. 读取设置类的静态字段时(被final修饰、已在编译期把结果放入常量池的除外)。
    4. 使用java.lang.reflect包的方法对类进行反射调用。
    5. 初始化某个类的子类时
    6. 虚拟机启动时被标明为启动类(包含main方法的类)。

    从上面我们知道了静态成员变量的初始化发生在类的 初始化阶段,而要实例化一个对象就必须先去加载、连接、以及初始化该类,才能去使用阶段该类去实例化对象,而非

    静态成员变量的初始化发生在对象的实例化过程中。如下例子可以看出当一个类被第一次主动使用静态块或静态成员变量会被初始化。

    复制代码
     1 package com.space.equalstest;
     2 
     3 public class Dog {
     4     public static String name = "tom";
     5 
     6     static {
     7         System.out.println("Dog init");
     8     }
     9 
    10     public static void info() {
    11         System.out.println("a dog");
    12     }
    13 }
    复制代码
    复制代码
    1 package com.space.equalstest;
    2 
    3 public class Test {
    4     public static void main(String[] args) {
    5         Dog.info();//首次主动使用进行初始化
    6         Dog.info();//不会再去初始化
    7     }
    8 }
    复制代码

    输出结果:

    1
    2
    3
    Dog init
    a dog
    a dog

      

  • 相关阅读:
    python修改镜像源
    nginx 记录
    linux 常用命令
    修改ssh连上默认目录
    sqlplus 导出一张表数据
    推送kafka消息失败
    Mybatis generator配置
    Oracle导库
    docker -- 安装mysql8.0.16
    安装自动集成工具jenkins
  • 原文地址:https://www.cnblogs.com/lubocsu/p/5097552.html
Copyright © 2011-2022 走看看