java类中的静态变量是什么时候初始化的
2016-11-09 10:24
232 查看
我们知道一个类(class)要被使用必须经过装载,连接,初始化这样的过程。下面先对这三阶段做一个简单的描述,之后会结合一个简单的例子来说明java中类的初始化过程。
在装载阶段,类装载器(Bootstrap ClassLoader 或者用户自定义的ClassLoader) 把编译形成的class文件载入内存,创建类相关的Class对象,这个Class对象封装了我们要使用的类的类型信息。
连接阶段又可以分为三个子步骤:验证、准备和解析。
验证就是要确保java类型数据格式 的正确性,并适于JVM使用。
准备阶段,JVM为静态变量分配内存空间,并设置默认值,注意,这里是设置默认值,比如说int型的变量会被赋予默认值0
。在这个阶段,JVM可能还会为一些数据结构分配内存,目的
是提高运行程序的性能,比如说方法表。
解析过程就是在类型的常量池中寻找类、接口、字段和方法的符号引用,把这些符号引用替换成直接引用。这个阶段可以被推迟到初始化之后,当程序运行的过程中真正使用某个符号引用的时候
再去解析它。
类会在首次被“主动使用”时执行初始化,为类(静态)变量赋予正确的初始值。在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化块给出的。而我们这里所说的主动使用 包括:
1. 创建类的实例
2. 调用类的静态方法
3. 使用类的非常量静态字段
4. 调用Java API中的某些反射方法
5. 初始化某个类的子类
6. 含有main()方法的类启动时
初始化一个类包括两个步骤:
1、 如果类存在直接父类的话,且直接父类还没有被初始化,则先初始化其直接父类
2、 如果类存在一个初始化方法,就执行此方法
在装载阶段,类装载器(Bootstrap ClassLoader 或者用户自定义的ClassLoader) 把编译形成的class文件载入内存,创建类相关的Class对象,这个Class对象封装了我们要使用的类的类型信息。
连接阶段又可以分为三个子步骤:验证、准备和解析。
验证就是要确保java类型数据格式 的正确性,并适于JVM使用。
准备阶段,JVM为静态变量分配内存空间,并设置默认值,注意,这里是设置默认值,比如说int型的变量会被赋予默认值0
。在这个阶段,JVM可能还会为一些数据结构分配内存,目的
是提高运行程序的性能,比如说方法表。
解析过程就是在类型的常量池中寻找类、接口、字段和方法的符号引用,把这些符号引用替换成直接引用。这个阶段可以被推迟到初始化之后,当程序运行的过程中真正使用某个符号引用的时候
再去解析它。
类会在首次被“主动使用”时执行初始化,为类(静态)变量赋予正确的初始值。在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化块给出的。而我们这里所说的主动使用 包括:
1. 创建类的实例
2. 调用类的静态方法
3. 使用类的非常量静态字段
4. 调用Java API中的某些反射方法
5. 初始化某个类的子类
6. 含有main()方法的类启动时
初始化一个类包括两个步骤:
1、 如果类存在直接父类的话,且直接父类还没有被初始化,则先初始化其直接父类
2、 如果类存在一个初始化方法,就执行此方法
相关文章推荐
- Java类什么时候开始初始化
- ScrollView在初始化滚动条在某一位置的时候为什么非得开一个线程?还有就是scrollTo与smoothScrollTo的区别是什么?
- java类的初始化程序块以及被实例化时候的执行顺序
- 在初始化一个类,生成一个实例的时候;newInstance() 和 new 有什么区别?
- NSMutableDictionary 初始化的时候initWithCapacity有什么作用
- 单例模式中静态变量初始化与不初始化有什么区别?
- 用derived object 初始化(或赋值) base object 的时候,会发生 什么???【c++ Primer】
- 什么是watchdog + 为何在要系统初始化的时候关闭watchdog
- NSMutableDictionary 在初始化的时候initWithCapacity有什么作用
- 在初始化一个类,生成一个实例的时候;newInstance() 和 new 有什么区别?
- static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法
- informix初始化的时候都作了什么
- C++ exception throw和catch的时候,发生了什么
- 是时候做点什么了
- 当call/apply传的第一个参数为null/undefined的时候js函数内执行的上下文对象是什么呢?
- 局部静态变量初始化
- springMVC能做什么,做j2ee时候要考虑什么
- 成员变量、局部变量、静态变量的初始化问题
- :hover选择器、:active选择、:focus选择器 分别在什么时候生效
- Java类及对象的初始化