【预习笔记】一道很有趣的有关java类加载初始化的题目
来源:互联网 发布:数据结构与算法 目录 编辑:程序博客网 时间:2024/06/11 22:20
public class classInit {public static void main(String[] args) {sampleA.showNum();}}class sampleA{public static sampleA sa = new sampleA();public static int num;public static int num2 = 250;public sampleA(){this.num = 110;this.num2 = 110;}public static void showNum(){System.out.println(num);System.out.println(num2);}}
上面这题我第一次给出的运行结果是:110 110
但是是错的。因为设计到类加载初始化的问题。
能够触发初始化的条件:
1)创建类的实例
2)访问类的静态变量
3)访问类的静态方法
4)当初始化一个类时,发现其父类还未初始化,则先出发父类的初始化
5)虚拟机启动时,定义了main()方法的那个类先初始化
上面这段代码,是调用了sampleA的静态方法,因此触发初始化,但是初始化的第一行又调用了构造函数,因此,整个流程如下所示:
然后针对这几个条件实验其他几种情况下的初始化触发:
创建对象的时候:
public class classInit2 {public static void main(String[] args) {new sampleB().showNum();}}class sampleB{public static sampleB sa = new sampleB();public static int num;public static int num2 = 250;public sampleB(){this.num = 110;this.num2 = 110;}public static void showNum(){System.out.println(num);System.out.println(num2);}}
输出:110 110
可以发现,当调用构造函数的时候,立即完成初始化,然后在进入构造函数进行赋值。若把构造函数中的num2赋值注释掉,输出结果将为:110 250
虚拟机启动时,main方法所在的类先做初始化:
public class classInit2 {public static classInit2 ci = new classInit2();public static int num;public static int num2 = 250;public classInit2(){num = 110;num2 = 110;}public static void showNum(){System.out.println(num);System.out.println(num2);}public static void main(String[] args) {classInit2.showNum();}}
输出与第一个例子相同,也是 110 250
最后总结一下java类加载的过程:
加载->验证->准备->解析->初始化->使用->卸载。
大概的解释:
加载:通过类的全限定名获取二进制的字节流,将此字节流所代表的静态存储结构转化为方法区的数据结构,在java堆中生成一个java.lang.class作为方法区中数据结构的访问入口。
验证:验证这个字节流是无害的,虽然java编译器会阻止大多数有害代码产生(如数组越界),但是字节流可以直接手动编写,虚拟机需要验证字节流是安全的对虚拟机没有破坏作用的字节流。
准备:将类的静态变量初始化为默认值。
解析:将符号引用转换为直接引用。
阅读全文
0 0
- 【预习笔记】一道很有趣的有关java类加载初始化的题目
- 一道有趣的题目
- 一道有趣的题目
- 一道有趣的题目
- {Java}一个有关类属性初始化的有趣儿情况
- 一道有趣的SQL题目
- 一道有趣的循环题目
- 一道有趣的笔试题目!
- 一道有趣的题目007
- 一道有关static的题目
- 关于byte的一道有趣的题目
- 一道有趣的C#考试题目
- 一道有趣的C#考试题目
- 一道有趣的C#考试题目
- 一道有趣的C#考试题目
- 一道有趣的题目 转F
- 一道类加载相关的题目
- 关于类加载机制的一道题目
- ssm+shiro
- mybatis
- Agri-Net
- Tegra TK1中文输入法出错解决
- HDU 3565 数位DP + 上下界
- 【预习笔记】一道很有趣的有关java类加载初始化的题目
- Spring MVC概述:
- JavaScript之Date对象详解
- tcp长连接和短连接
- .equals ==
- redis在spring中的配置及java代码实现
- MapperScannerConfig整合spring数据源的常见错误:Cannot load JDBC driver class ${driverClassName}
- Struts2实现原理
- C++ 将析构后的指针传递给函数