1. 类的属性初始化
Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。
(1)int类型变量默认初始值为0
(2)float类型变量默认初始值为0.0f
(3)double类型变量默认初始值为0.0
(4)boolean类型变量默认初始值为false
(5)char类型变量默认初始值为0(ASCII码)
(6)long类型变量默认初始值为0
所有对象引用类型变量默认初始值为null,即不指向任何对象,包括数组等。
对于两种不对的类属性,static属性与instance属性,初始化的时机是不同的:
(1)instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。
2. 方法里的局部变量
(1)必须明确地进行初始化;
(2)如果在没有初始化之前就试图使用它,编译器会抗议;
(3)如果初始化的语句在try块中或if块中,也必须要让它在第一次使用前一定能够得到赋值。
3. 类初始化时构造函数调用顺序
(1)初始化对象的存储空间为零或null值;
(2)调用父类构造函数;
(3)按顺序分别调用类成员变量和实例成员变量的初始化表达式;
(4)调用本身构造函数
4. 类初始化时的其他问题
(1)如果java文件没有package,就默认给文件加上“无名”package;
(2)默认导入java.lang包,所以我们的java程序中可以使用String,Math,Integer等类,包括一些异常类;
(3)如果生成的类没有父类,则为这个类隐式加上父类Object,因此,包括Object中的许多方法都可以使用;
(4)运行顺序
建立一个非主类对象,顺序为:静态初始化块static{} -> 初始化块{} -> 构造函数constructor
牵涉到父类:
父类静态初始化块 -> 子类静态初始化块 -> 父类初始化块 -> 父类构造函数 -> 子类初始化块 -> 子类构造函数
注意:初始化块和构造函数是接连运行的,不会父类子类交替。