类初始化方法clinit()
1,类初始化方法,一个类只有一次。
2,由编译器生成,分为两部分:(按出现的顺序执行)
a.静态变量的显式赋值;
b.静态代码块。
实例初始化方法init()
1,init()创建几个对象就执行几次,与构造器个数有关。
2,作用是创建对象时,为对象进行初始化操作,包括:(a、b按出现的顺序执行,c一定最后执行)
a.为成员变量显示赋值(声明和赋值为两步);
b.执行非静态代码块;
c.执行构造器。
3,Java编译器会把上述三个部分的代码,合成一个叫做init(形参列表) 的实例初始化方法,即编译后的.class文件中没有构造器这个概念。
即init(形参列表) 实例初始化方法的代码由三部分组成:
a.成员变量显式赋值的代码;
b.非静态代码块的代码;
c.构造器的代码。
例:类的初始化
class Demo{
static{
System.out.println("1,Demo静块1");
}
private static String info=assign();
static{
System.out.println(info);
System.out.println("2,Demo静块2");
}
public static String assign(){
System.out.println(info);
System.out.println("3,assign方法");
return hello;
}
}
//上述代码的类初始化为
class Demo{
private static String info;
<clinit>(){//类初始化方法
//执行第一个静态代码块
System.out.println("1,Demo静块1");
//执行静态变量的赋值
info=assign();//此处转跳到assign方法
//执行第二个静态代码块
System.out.println(info);
System.out.println("2,Demo静块2");
}
assign(){
System.out.println(info); //为null
System.out.println("3,assign方法");
return "hello";
}
}
包含父子类的情况
Java代码执行顺序问题—父子类、(实例)初始化块,见链接:http://t.csdn.cn/D0m1L