五种类型变量:静态代码块,父类构造器,普通变量/静态变量类,一般代码块(放在{}中),构造器以及@Autowired的执行顺序及注意细节是:
- 静态代码块—>父类构造器—>变量(包含静态变量类)—>一般代码块—>子类构造器—>@Autowired;
- 每次新建对象都会调用静态变量类构造器,同普通变量;静态变量与静态代码块不同;
- 静态代码块只运行一次,普通代码每次初始化对象都运行;
- 构造器中如果使用@Autowired注释的变量会报错,因为构造器先于其运行;
示例代码(@AutoWired未生效):驱动程序和演示程序
//驱动程序
public class TestVarAndAnno {
public static void main(String[] args) {
new VarAndAnno();
new VarAndAnno();
new VarAndAnno();
}
}
//演示程序
/**
* 测试变量、静态代码块、构造器、父类构造器以及@AutoWried注释变量的初始化顺序
*
* @author dugenkui
* on 2017/10/28.
*/
class ClassVarX{
public ClassVarX() {
System.out.println("Var's Constructor");
}
}
class StaticVar{
public StaticVar() {
System.out.println("StaticVar's Constructor");
}
public void test(){
System.out.println("ClassVarY's method");
}
}
class Father{
public Father() {
System.out.println("father's Constroctor");
}
}
public class VarAndAnno extends Father{
//静态代码块
static{
System.out.println("static code");
}
//父类构造器
//变量
ClassVarX classVarX=new ClassVarX();
StaticVar staticVar=new StaticVar();
//普通代码块
{
System.out.println("common code in {}");
}
//构造器
public VarAndAnno() {
System.out.println("son's Constroctor");
}
}