最近在看Java编程思想,准备系统的巩固一下基础知识。
对于java类的成员初始化顺序,总结记录一下;
在一个简单无继承关系的类中 ,通过构造器初始化,直接上代码:
public class test {
/**
* Description
* @param args
*/
public static void main(String[] args) {
new Java();
}
}
class Java {
{
System.out.println("Java1 初始化块");
}
static {
System.out.println("Java静态初始化块");
}
{
System.out.println("Java2 初始化块");
}
public Java() {
System.out.println("Java构造函数");
}
}
执行结果:
Java静态初始化块
Java1 初始化块
Java2 初始化块
Java构造函数
可以发现:
无继承关系的类中
1、静态变量或者静态初始化块按照代码中的顺序先执行
2、非静态变量或者非静态变量初始化块按照代码顺序先执行
3、构造方法执行
下面看一下有继承关系的类中初始化顺序
public class initTest {
/**
* @parm args
*/
public static void main(String[] args) {
new Son();
System.out.println("************");
new Son();
}
}
class Father{
static {
System.out.println("Fathier静态初始化块");
}
{
System.out.println("Fathier 初始化块");
}
public Father() {
System.out.println("Fathier构造函数");
}
}
class Son extends Father {
{
System.out.println("Son 初始化块");
}
static {
System.out.println("Son静态初始化块");
}
public Son() {
System.out.println("Son构造函数");
}
}
结果:
Fathier静态初始化块
Son静态初始化块
Fathier 初始化块
Fathier构造函数
Son 初始化块
Son构造函数
************
Fathier 初始化块
Fathier构造函数
Son 初始化块
Son构造函数
可以看到:
1.父类静态成员和静态初始化快,按在代码中出现的顺序依次执行。
2.子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
3. 父类的非静态成员和非静态初始化块,按在代码中出现的顺序依次执行。
4.执行父类的构造方法。
5.子类非静态成员和非静态初始化块,按在代码中出现的顺序依次执行。
6.执行子类的构造方法。
并且可以看到,静态初始化块只执行一次,非静态初始化快每次都会执行,那么这两者还有什么其他区别呢?
非静态初始化块主要是用于对象的初始化操作,在每次创建对象的时都要调用一次,其执行顺序在构造方法之前。
在初始化块之前有static修饰,则为静态初始化块。由于非静态成员不能再静态方法中使用,同样也不能在静态初始化块中,因此,静态初始化块主要用于初始化静态变量和静态方法,静态初始化块只调用一次,是在类的第一次加载到内存时,并非一定要创建对象才执行,静态初始化块比非静态初始化块先执行。