今天测试了一下java代码的执行顺序。
通常,我们会认为jvm加载一个类时,首先会执行main方法,其实并不是这样的。测试一下得知,真正执行顺序如下:
static变量—>Static代码块—> mani()—>实例变量—>代码块—>构造函数
JVM只为静态分配一次内存,在加载类的过程中首先找带static的,为其内存分配
测试代码:
package test;
/**
* @author ydj
*/
public class TestExecuteOrder {
private A a=new A();
private static B b=new B("TestExecuteOrder类依赖");
private C c;
{
System.out.println("代码块");
c=new C();
}
static{
//错误的 c=new C();
System.out.println("静态代码块");
}
TestExecuteOrder(){
System.out.println("TestExecuteOrder构造方法");
}
public void commonMethod(){
{
System.out.println("普通方法中代码块");
}
//错误的 static int i=0;
//错误的 static {}
System.out.println("普通方法中其它代码");
}
public static void staticMethod(){
{
System.out.println("静态方法中代码块");
}
//错误 static int i=0;
//错误 static {}
System.out.println("静态方法中其它代码");
}
public static void main(String[]args){
System.out.println("main() 方法");
TestExecuteOrder obj=new TestExecuteOrder();
//obj.commonMethod();
}
}
class A{
private static B b=new B("A类依赖");
A(){
System.out.println("A的构造函数");
}
{
System.out.println("A的代码块");
}
static{
System.out.println("A的静态代码块");
}
}
class B{
B(String form){
System.out.println("B的构造函数<-"+form);
}
}
class C{
C(){
System.out.println("C的构造函数");
}
}
测试结果:
B的构造函数<-TestExecuteOrder类依赖
静态代码块
main() 方法
B的构造函数<-A类依赖
A的静态代码块
A的代码块
A的构造函数
代码块
C的构造函数
TestExecuteOrder构造方法