大家知道,只要打开任何一个开源软件,看到很多在类申明时候同时申明一个静态对象,此种情况JVM是如何加载的呢?
以下步骤是针对下面程序例子来剖析,执行顺序会受到申明的静态对象位置而不一样
Step1:加载父类的静态变量
Step2:加载父类的静态代码块
Step3:加载子类的静态变量(public static int k=0; )
Step4:public static StaticTest s1=new StaticTest("s1"); ===》会引起对象实例化的过程
Step4.1 :父类类中静态变量(类变量)(如若已经加载,JVM会跳过,不会重复赋值)
Step4.2 :父类中静态代码块(如若已经加载,JVM会跳过,不会重复赋值)
Step4.3 :子类的中静态变量(类变量)(如若已经加载,JVM会跳过,不会重复赋值)
Step4.4 :子类中的静态代码块(如若已经加载,JVM会跳过,不会重复赋值)
Step4.5:父类中的非静态变量
Step4.6:父类中的非静态代码块
Step4.7:父类构造函数
Step4.8:子类中的非静态变量
Step4.9:子类中的非静态代码块
Step4.10:子类构造函数
以下代码已经给出了代码执行顺序以Step注释的
class FatherStaticTest
{
public FatherStaticTest()//Step4.3 Step8.2
{
System.out.println("I am in the class Father");
}
public static int fi=100; //Step1
public int fii=200;//Step4.1 Step8.1
static //Step2
{
System.out.println("fi is"+fi);
}
{//Step4.2
System.out.println("fii is "+fii);
}
}
public class StaticTest extends FatherStaticTest {
public static int k=0; //Step3
public static StaticTest s1=new StaticTest("s1");//Step4
public static int i=print("i"); //Step5
public static int n=99; //Step6
public int j=print("j"); //Step4.4 Step8.3
{ //Step4.5 Step 8.4
print("构造块");
}
static //Step7
{
print("静态块");
}
public static int print(String s)
{
System.out.println(++k+":"+s+"\ti="+i+"\tn="+n);
++n;
return ++i;
}
public StaticTest(String s) //Step4.6 Step 8.5
{
System.out.println(++k+":"+s+"\ti="+i+"\tn="+n);
++i;
++n;
}
public static void main(String[] args) {
new StaticTest("Ben"); //Step8
//StaticTest.print("ben");
}
}
执行结果如下:
D:\myjava>java StaticTest
fi is100
fii is 200
I am in the class Father
1:j i=0 n=0
2:构造块 i=1 n=1
3:s1 i=2 n=2
4:i i=3 n=3
5:静态块 i=4 n=99
fii is 200
I am in the class Father
6:j i=5 n=100
7:构造块 i=6 n=101
8:Ben i=7 n=102
D:\myjava>