不再一一叙述java中的各种定义和规定,
这里就是举了两个例子,详细阐述,java代码运行时,成员变量和构造函数的加载和执行顺序。
package com.gt.world.oa.aaa;
/**
*
* @author GT
*/
public class Test20140331 {
public static int k = 0;
public static Test20140331 t1 = new Test20140331("t1");
public static Test20140331 t2 = new Test20140331("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
{
print("构造块");
}
static {
print("静态块");
}
public Test20140331(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
}
private static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}
public static void main(String[] args) {
Test20140331 t = new Test20140331("init");
Test20140331 t2 = new Test20140331("init2");
}
}
/**
*
* 1 程序从main函数开始执行 ,执行main函数,需要先加载class文件
* 2 加载class文件的同时,同时初始化static成员变量和static块,执行顺序为从上到下依次执行
* 3 加载class完成之后,初始化成员变量。注:普通代码块,可以看作成员变量,执行顺序为从上到下依次执行
* 4 上面的过程完成之后,再从main函数的第一条语句开始执行。
* 5 注:静态成员变量和静态代码块只会 在加载class文件的时候 执行一次
*/
/**
* public static Test20140331 t1 = new Test20140331("t1");
* 1> 1:j i=0 n=0
* 2> 2:构造块 i=1 n=1
* 3> 3:t1 i=2 n=2
*
* public static Test20140331 t2 = new Test20140331("t2");
* 4> 4:j i=3 n=3
* 5> 5:构造块 i=4 n=4
* 6> 6:t2 i=5 n=5
*
* public static int i = print("i");
* 7> 7:i i=6 n=6
*
* public static int n = 99;
* 8> n=99
*
* static {
print("静态块");
}
* 9> 8:静态块 i=7 n=99
*
* Test20140331 t = new Test20140331("init");
* 10> 9:j i=8 n=100
* 11> 10:构造块 i=9 n=101
* 12> 11:init i=10 n=102
*
* * Test20140331 t = new Test20140331("init2");
* 13> 12:j i=11 n=103
* 14> 13:构造块 i=12 n=104
* 15> 14:init2 i=13 n=105
*
*/
package com.gt.world.oa.aaa;
class Insect {
private int i = 9;
protected int j;
public Insect() {
System.out.println("i = " + i + ",j=" + j);
j = 39;
}
private static int x1 = printInit("static intx1 initialized");
static int printInit(String s) {
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect {
private int k = printInit("beetle.k initialized");
Beetle() {
System.out.println("k=" + k);
System.out.println("j = " + j);
}
private static int x2 = printInit("static beetle.x2 initialized");
public static void main(String[] args) {
System.out.println("beetle constructor");
Beetle b = new Beetle();
}
}
/**
* 1> main方法要执行,需要先加载main方法所在的类的Class文件,
* 也就是Beetle的Class,因为Beetle有父类Insect,所以现在加载Insect的Class文件
* 2>静态成员变量和静态代码块的初始化和加载Class文件是同步进行的,
* 所以加载Class文件的同时,完成静态代码块和静态成员变量的初始化工作
* 3>Class文件加载完成之后,开始逐条语句执行 main方法
* 4>在new 对象实例的时候,也会先执行当前类的父类的构造器
* 5>类的实例化,会按顺序初始化 成员变量,最后执行构造函数
*
* 综上:代码执行顺序如下
* 1>private static int x1 = printInit("static intx1 initialized");
* 2>private static int x2 = printInit("static beetle.x2 initialized");
* 3>System.out.println("beetle constructor");
* 4>Beetle b = new Beetle();
* 5>private int i = 9;
* 6>protected int j;
* 7>public Insect() {
System.out.println("i = " + i + ",j=" + j);
j = 39;
}
* 8> private int k = printInit("beetle.k initialized");
* 9>Beetle() {
System.out.println("k=" + k);
System.out.println("j = " + j);
}
*
*/