自己写了一个小的例子,来说明在类创建的过程中,父类与子类静态变量、普通成员变量、构造器的初始化顺序。
package com.liuxmThinkInJava.initialize;
/**
* 父类
* @author Administrator
*
*/
public class SuperClass {
private static InitializeDesc superVarial = new InitializeDesc("父类静态变量被初始化");
static{
InitializeDesc superVarial = new InitializeDesc("父类静态块中的变量被初始化");
}
private InitializeDesc i3 = new InitializeDesc("父类普通成员变量1被初始化");
private InitializeDesc i4 = new InitializeDesc("父类普通成员变量2被初始化");
public SuperClass(){
System.out.println("父类构造器被调用");
}
public static void fun(){
System.out.println("父类静态方法被调用");
}
}
package com.liuxmThinkInJava.initialize;
/**
* 子类
* @author Administrator
*
*/
public class SubClass extends SuperClass{
private static InitializeDesc i = new InitializeDesc("子类静态变量被初始化");
static{
InitializeDesc i2 = new InitializeDesc("子类静态块中的变量被初始化");
}
private InitializeDesc i3 = new InitializeDesc("子类普通成员变量1被初始化");
private InitializeDesc i4 = new InitializeDesc("子类普通成员变量2被初始化");
public SubClass(){
System.out.println("子类构造器被调用");
}
public static void main(String[] args) {
//System.out.println("在子类中调用main方法");
//System.out.println("创建子类对象开始》》》》》》》》》》");
new SubClass();
//System.out.println("创建子类对象结束《《《《《《《《《《");
}
}
/**
* 辅助描述类
* @author Administrator
*
*/
public class InitializeDesc {
public InitializeDesc(String desc){
System.out.println(desc);
}
}
在子类中运行main方法,输出结果中可以清晰的看到初始化的顺序:
父类静态变量被初始化
父类静态块中的变量被初始化
子类静态变量被初始化
子类静态块中的变量被初始化
父类普通成员变量1被初始化
父类普通成员变量2被初始化
父类构造器被调用
子类普通成员变量1被初始化
子类普通成员变量2被初始化
子类构造器被调用
比较重要的几点:
1、在类的内部,变量的定义顺序,决定了变量的初始化顺序,即使这些变量分散在方法之间。
2、静态变量只有在第一次创建对象或者第一次调用静态数据时才被初始化。
3、初始化的顺序是先静态对象,而后是非静态对象。
4、局部变量初始化:变量必须被初始化,否者提示编译错误。
5、成员变量初始化:变量不被初始化,会有默认值出现。
6、自动初始化将在构造器初始化之前执行。