相关准备知识:
1. 一个类在初次使用时必须进行初始化;
2. 类文件的装载过程:加载 、 连接(包括三个步骤:验证 准备 解析) 、初始化。如图所示:
而类的使用可分为主动使用和被动使用两种。其中主动使用包括以下几种情况:
- 当创建一个类的实例时,比如使用new关键字,或者通过反射、克隆、反序列化方式。
- 当调用类的静态方法时,即当使用了字节码invokestatic指令
- 当使用类或者接口的静态字段时(final常量除外,此种情况只会加载类而不会进行初始化),即使用getstatic或者putstatic指令(可以使用jclasslib软件查看生成的字节码文件)
- 当使用java.lang.reflect包中的方法反射类的方法时
- 当初始化子类时,必须先初始化父类
- 作为启动虚拟机、含有main方法的那个类
符合主动装载中的两个条件:使用new关键字创建类的实例会装载相关的类,以及在初始化子类时,必须先初始化父类。除此之外,所有引用类的方式都不会触发初始化,称为被动引用。即在被动引用中只加载未做初始化。
静态变量与实例变量的主要区别在于:
每个静态变量会在程序加载该类的字节码时被分配内存空间,此后这些静态变量的操作被局限在这个空间里面。举个栗子:仓库里面有100张票,4个窗口正在卖这张票,只要有一个窗口卖掉一张票,仓库的票就会减少。而实例变量在每次创建对象时被分配空间,每建立一次对象分配一次,每个实例对象之间的实例变量是互不影响的。
例子:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|