zoukankan      html  css  js  c++  java
  • 加载器二:类初始化的时机

    上节讲了Java类初始化的步骤,那么什么时候执行初始化操作呢?

    下面6种方式使用某个类或接口时,系统会初始化类或接口:

    创建类的实例。为某个类创建实例的方法包括:使用new来创建实例;通过反射创建实例;通过反序列化的方式创建

    调用某个类的类方法(静态方法)

    访问某个类或接口的类变量,或为该类变量赋值

    使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。例如:Class.forName(xxx.xxx.Person);如果系统还未初始化Person类,则这行代码将会刀子该Person类初始化,返回Person类对应的java.lang.Class对象。

    初始化某个类的子类。当初始化某个类是,系统会检查这个类是否有父类及该父类是否初始化,最终的结果是子类上级的所有父类都会被初始化。

    直接使用java.exe命令 来运行某个主类。当这个主类运行时,会先初始化该主类。例如在一个类中运行main函数。

    除此之外,还有以下情形需要特别指出。
    对于 一个final修饰的类变量,如果该类变量的值在编译时就可以确定下来,那么这个类变量相当于“宏变量”,也可理解成“常量”。Java便一起去会在编译时直接把这个类变量出现的地方替换成它的值,因此即使程序使用该静态变量也不会导致该类的初始化。

    class MyTest {
        static {
            System.out.println("使用final的静态变量----静态初始化块...");
        }
    
        // 使用一个字符串直接量为static final的类变量赋值
        static final String compileConstant = "final静态变量";
    }
    class MyTest2 {
        static {
            System.out.println("没有使用final的静态变量----静态初始化块...");
        }
    
        // 使用一个字符串直接量为static final的类变量赋值
        static String compileConstant = "静态变量";
    }
    public class CompileConstantTest {
        public static void main(String[] args) {
            // 访问、输出MyTest中的compileConstant类变量
            System.out.println(MyTest.compileConstant); //
            System.out.println(MyTest2.compileConstant); //
        }
    }
    /*
    结果:
    final静态变量
    没有使用final的静态变量----静态初始化块...
    静态变量
    
    */
    代码

    上面的程序中有一个String类型的变量,但该变量使用了final修饰,并且使用static修饰为静态变量,所以可以在编译时确定,这是该变量被当成“宏变量”处理。

    当某个静态变量(类变量)使用final修饰,但是它的值没有办法确定,那么通过该类访问这个变量就会导致该类初始化,例如

    static String compileConstant2 = System.currentTimeMillis()+"";

    这样会使该类初始化。

  • 相关阅读:
    Git学习-创建版本库
    使用Vim编辑器,如何退出
    设置既定目录的命令提示符
    字符数组和字符串
    一波杂乱的分享
    全国软件设计大赛C/C++语言练习
    HDU 1720、1062、2104、1064、2734、1170、1197、2629
    hdu 2000-2010 ACM
    HDU——算法练习1000 1089-1096
    爬虫学习笔记之为什么要设置超时时间,怎么设置(使用selenium)
  • 原文地址:https://www.cnblogs.com/fuluS/p/4704517.html
Copyright © 2011-2022 走看看