JAVA 类的初始化
类的初始化
之前的一篇文章是讲述的对象的初始化,这篇文章讲一讲类的初始化,以及类的初始化和对象初始化之间的一些异同。
首先同对象初始化一样,要搞清楚什么时候会进行类的初始化,和对象初始化不同,对象初始化的时候是new创建一个对象的时候,java会为对象进行初始化;而类的初始化进行的时机是:类第一次被使用的时候进行初始化,而且类的初始化只进行一次。
类被使用有三个情况:(1)、new 类名() 、包括:类名 对象名 = new 类名(); (2)、类.静态方法() (3)、类.静态属性名;
这儿就有人不明白,当创建一个对象的时候,是先进行类的初始化还是先进行对象的初始化?
答案是:先进行类的初始化,类的初始化优于对象的初始化,这一点要深刻理解,之后的学习会有很多地方都可以用这个来解释。
我们来说一下类的初始化的三个步骤:
第一步:类加载,将.class的二进制文件读到内存中;
第二步:(1)、类的静态变量分配空间、并且默认初始化(默认初始化之前说过的,整型为 0 ;浮点为:0.0 字符型为:'\u0000'引用为:null 布尔为:false)
(2)、声明时初始化,静态初始化块初始化,并且和对象的初始化一样,是按照代码的顺序从上到下的顺序执行的。
可以通过一段代码并且分析内存来理解一下类的初始化
public class StaticMethod {
static int no;
//1行,定义了一个类变量
static {
System.out.println("i最初为"+no);
//2行
no =++no ;
//3行
}
public static void main(String[] args) {
System.out.println("第一次调用类变量值为:"+StaticMethod.no);
//4行
System.out.println("第二次调用类变量值为:"+StaticMethod.no);
//5行
}
}
最终输出结果为:
最初为0
第一次调用类变量值为:1
第二次调用类变量值为:1
java执行的时候从main方法开始执行,main方法中调用了类变量,在代码第一行的时候定义了一个类变量,在静态代码块中,首先打印no的值并且给no赋了no=1的值
main方法中一共调用了两次类变量,但只初始化了一次。
可以通过内存的图来看一下:
首先是将类变量分配空间,默认初始化,再是静态初始化块进行初始化。