java类加载顺序
2015-06-05 14:53
363 查看
这里用个经典问题来说明。
过程:
1.类的加载:把类的二进制数据加载到内存中
2.连接
2.1. 验证:确保被加载类的正确性
2.2 准备:为类的静态变量分配内存并赋值(注意这里赋的是默认值)
2.3 解析:符合引用转为直接引用
3.初始化:为类的静态变量赋予正确的初始值
针对上述代码进行分析:
首先对类的静态变量分配内存并赋默认值。这里有3个静态变量:person count1 count2。按顺序分配内存并且赋默认值为null 0 0。接着调用了静态方法getInstance,该步骤触发了整个类的初始化,也就是上面第三步。person变量的初始化过程调用了构造函数,在构造函数中对count1 count2进行了++操作,值变为1 1。接着继续进行count1
count2变量的初始化赋值, count1没有赋值,保持1。count2赋值5,结果由1变成了5,所以最后的结果为1和5。
把上面的部分代码换一下:
加载过程直到为静态变量分配内存并赋默认值都和上面一样。从初始化开始发生了变化:初始化顺序变为了先对count1 count2进行初始化,再对person变量进行初始化。count1初始化为了0,count2初始化为了5,再对person进行初始化,调用其构造函数,在构造函数中对count1和count2进行了++操作,所以结果变为1和6。
总结:静态变量的初始化顺序对结果会产生很大的影响,这点在代码编写中要特别注意。
class Person { private static Person person = new Person(); public static int count1; public static int count2 = 5; private Person() { count1++; count2++; } public static Person getInstance() { return person; } public static void main(String[] args) { Person person=Person.getInstance(); System.out.println("count1: "+person.count1); System.out.println("count2: "+person.count2); } }输出为1和5。
过程:
1.类的加载:把类的二进制数据加载到内存中
2.连接
2.1. 验证:确保被加载类的正确性
2.2 准备:为类的静态变量分配内存并赋值(注意这里赋的是默认值)
2.3 解析:符合引用转为直接引用
3.初始化:为类的静态变量赋予正确的初始值
针对上述代码进行分析:
首先对类的静态变量分配内存并赋默认值。这里有3个静态变量:person count1 count2。按顺序分配内存并且赋默认值为null 0 0。接着调用了静态方法getInstance,该步骤触发了整个类的初始化,也就是上面第三步。person变量的初始化过程调用了构造函数,在构造函数中对count1 count2进行了++操作,值变为1 1。接着继续进行count1
count2变量的初始化赋值, count1没有赋值,保持1。count2赋值5,结果由1变成了5,所以最后的结果为1和5。
把上面的部分代码换一下:
public static int count1; public static int count2 = 5; private static Person person = new Person();
加载过程直到为静态变量分配内存并赋默认值都和上面一样。从初始化开始发生了变化:初始化顺序变为了先对count1 count2进行初始化,再对person变量进行初始化。count1初始化为了0,count2初始化为了5,再对person进行初始化,调用其构造函数,在构造函数中对count1和count2进行了++操作,所以结果变为1和6。
总结:静态变量的初始化顺序对结果会产生很大的影响,这点在代码编写中要特别注意。
相关文章推荐
- Spring动态管理IoC容器中的Bean
- 二叉搜索树及其方法的java实现
- fastjson解析中的javaBean
- Spring Security 2.0.5 学习笔记(二) - Service Method级别权限控制
- 详解Java中的clone方法 — 原型模式
- 非spring 方式修改quartz定时任务为串行处理
- Java父类调用子类
- JavaBean为什么实现Serializable(序列化)接口
- 浅谈java及应用
- java中的 RSA加密
- Java锁消除
- Resin 与 Eclipse的集成
- java中类、对象、实例的关系
- 非web工程java项目中的路径问题(针对以jar包运行的工程)
- intellij idea加载go开发插件源码时报错Error:ant: Cannot run 'patch-version' target: JDK '<unknown>' not found
- JAVA多线程实现的三种方式
- Java 中的内部类和匿名类
- Eclipse设置Android Logcat输出字体大小
- 10本Java经典书目推荐
- Failed executing 'cmd.exe /X /C ""C:\Program Files\Java\jdk1.6.0_38\jre\..\bin\jarsigner.exe"