本篇日志中,我们通过一系列实例,来验证 java 的初始化过程。
// Parent.java
package techlog;
/**
*
* @author 龙泉居士
* Environment Eclipse 3.7.2 JDK 7u2
* CopyRight copy is promised if you keep this statement
* Date 2012-2-2
*
*/
class Tip
{
public Tip(String str)
{
System.out.println(str);
}
}
public class Parent
{
public Parrent()
{
System.out.println("I'm Parrent");
say();
}
public void say()
{
System.out.println("Parrent.say "+i);
}
public int i=5;
static Tip t=new Tip("Parrent.stcTip");
public Tip t0=new Tip("Parrent.Tip");
}
class Son extends Parrent
{
public Son()
{
System.out.println("I'm Son");
System.out.println("i="+i);
i=7;
}
public int i=3;
static Tip t=new Tip("Son.stcTip");
public Tip t0=new Tip("Son.Tip0");
public Tip t1=new Tip("Son.Tip");
public void say()
{
System.out.println("Son.say "+i);
}
}
class Daughter extends Parrent
{
public Daughter()
{
System.out.println("I'm Daughter");
}
static Tip t=new Tip("Daughter.stcTip");
public Tip t0=new Tip("Daughter.Tip");
static public void main (String [] args)
{
Son s=new Son();
System.out.println(s.i);
}
}
/Output: Parrent.stcTip。 Daughter.stcTip。 Son.stcTip。 Parrent.Tip。 I’m Parrent。 Son.say 0。 Son.Tip0。 Son.Tip。 I’m Son。 i=3。 7。///:~
1. 加载main方法所在类Daughter 2. 加载Daughter父类Parent 3. 加载Parent父类Object 4. 按加载层次,即类继承层次,依次初始化Object,Parent,Daughter类的static域 5. 执行main方法 6. 例中main方法创建了一个Son对象s 7. 加载Son 8. 加载Son的父类Parent 9. 加载Parent的父类Object 10. 按照加载层次即继承层次依次初始化类static域,对于已初始化过的static域,不在重复进行 11. 将Son类内所有非static非final成员初始化为0 (i=0) 12. 执行Son构造器 13. Son构造器中第一条语句执行Son父类Parent构造器 14. 将Parent类内所有非static非final成员初始化为0 15. 在Parent构造器中第一条语句执行Parent的父类Object的构造器 16. 初始化Object非static非final域 17. 继续执行Object构造器其他语句 18. 初始化Parent非static非final域 19. 继续执行Parent构造器其他语句(注意,由于多态性,无论在执行的是哪个构造器this引用均为Son类引用,而Son类此时所有非static非final域均为0) 20. 初始化Son非static非final域 (i=3) 21. 继续执行Son构造器其他代码 (i=7) 22. 初始化工作完毕
1. 加载 main 方法所在类 2. 递归加载父类 3. 从父类到子类递归初始化 static 成员 4. 从父类到子类顺序初始化成员变量、调用构造方法