假设有一下类:
class Test{
int i;
int j = 0;
int count(){ return 0 };
Test() {}
int n =0;
}
我们知道,任何对象在使用前都会被初始化,方法里面的局部变量必须给初始化值才能通过编译。
现在我们来讨论一下初始化的过程:
对于字段(变量)而言,如果是基本类型,那么即使不给初始值,都会得到jvm默认的初始值:boolean默认是false,byte、short、int、long是0,double和float是0.0,char为/u0000(很早的jvm赋值为0),如果是对象,比如 Test test;打印test则出现null,这样子就不难理解为什么我们用system.out打印对象的时候,会得到对象的地址。
在类的内部,变量定义的顺序决定了初始化的顺序:int i定义在int j前,i先得到初始化值。
所有变量都会在方法、包括构造方法被调用前得到初始化。
在我上一篇关于static的博客里面说道static关键字的特性,在这里说说静态数据的初始化:
无论创建多少个对象,静态数据都只占有一份存储区域(静态变量和方法属于类),static不能用于局部变量。
对于对象的初始化,也先是静态对象在前,
那么这里可能就有一个疑问:静态方法和普通变量,谁先是被初始化呢?答案其实我意见说了,还是变量先初始化。
事实上,构造方法也是静态方法,只是没有写明static而已,所有的变量都会在构造器(静态方法之前执行)。
在一些类里,会有静态代码块,即static{ },静态代码块会有限执行(同为静态代码块按顺序执行),和静态初始化动作一样,只执行一次。
本文内容参考了第四版《Java编程思想》