Java 初始化相关
本博客参考《thinking in java》第四版的第五章的相关内容
- 局部变量基本数据类型:如果一个基本数据类型的变量在声明后没有进行初始化而被使用,那么会出现一个编译错误。
类的数据成员数据类型:此时,类的每一个数据成员都会有一个初始值。
数据类型 默认值 boolean false char ” byte 0 short 0 int 0 float 0 long 0 float 0.0 double 0.0 reference null 类数据成员初始化:
声明的同时初始化 :
public boolean bool = true;
在构造函数中进行初始化
初始化块中初始化
{ i = 10; // 当然i要在你的数据域中进行事先的声明 }
经过试验,类的这几个部分的初始化顺序是先是初始化静态成员变量,然后再是非静态成员变量;而且初始化的顺序先是初始化声明部分,再是初始块部分,最后才是构造函数部分。
总结一下对象的创建过程,假设有一个Dog的类:
- 构造器实际上是静态方法,即首次创建Dog对象或者Dog类静态方法/域首次被访问时,java解释器必须查找类路径。
- 载入Dog.class,有关静态初始化的所有动作都会执行,因此静态初始化只在Dog对象首次加载时进行一次。
- 当用new Dog()创建对象时,首先在堆上为Dog对象分配足够的储存空间。
- 这块空间会被清零,即Dog对象中的基本数据类型都会设置为默认值,而引用会被设置为null。
- 执行所有出现在字段定义处的初始化动作。
- 执行构造器。
数组的初始化
要定义一个数组,只需要
int[] array // 其实现在只是拥有一个数组的引用,并没有给数组分配内存空间
数组的初始化
array = new int[5]; // 数组的每一个元素都是取得默认值(此处为0),如果array类型不是基本类型,那么将会得到一个引用数组。 int[] array2 = {1,2,3};
- 每个类的编译代码都存在于它自己的独立文件中,该文件只在需要使用程序代码时才会被加载,一般来说,可以认为类的代码在初次使用时才会加载,这通常是指加载发生于创建类的第一个对象时,但是当访问static域或者static方法时,也会发生加载(构造器其实也是static方法,准确来说,类是在任何static成员被访问时加载的)。初次使用之处也是static初始化发生之处,所有的static对象和static代码都会在加载时依程序中的顺序进行初始化。当然,static的成员只会初始化一次。