
//静态块
static {
A a = new A();
i = 10;
}
public static int i;
public int j;
public A() {
System.out.println(A.i);
System.out.println(j);
}
public static void main(String[] args) {
A a = new A();
}
}
求结果和出现这个结果的原因
结果:
0
0
10
0
首先,static模块在类加载中首先会被加肆肢载且只会被加载一次,构造缓物函数则可以多次加载。
加载顺序为:static模块、构造方法
主方法(程序入口)main方法中,new A();,所以会去加载static{}。裂哪世在static中又一次new A,所以会调用其构造方法public A() {},此时打印出来的内容是 i=0 j=0,二者都是初始化的值。
static模块加载之后,会去加载其构造方法。此时i在static中赋值为10,j不变,所以在构造方法的第二次调用中打印的是i=10 j=0。
0 0 10 0
这个java类的加渗州载顺序有关系或者说实例化有关
1、实例化一个类的第一步是找到该类的构滚枝造器,如果没有显示的则调用大喊敏默认的无参构造
2、而静态块和静态变是在找构造器之前就被先加载的,所以可以从上往下看程序
3、道先第一次执行new A()时,i=10还没有来得及初始化调用的是默认初妈值,所以不难明白
System.out.println(A.i);
System.out.println(j);
打印的都是否0 0了;而程序继续执行static{....}初始化i=10;然后静态块和静态变量初始化完
再去构建main(..)里的实例,所以第二次的打印会出现A.i =10,j=0 。
4、如果有兴趣研究一下数据结构的堆和zan的概念,理念起来会更简单些。
程拆洞颂序执行结果:
0
0
10
0
首先要明确程序执行的顺序:
静态代码块优先颤中于主方法执行,类中定义的静态块优先于构造方法执行。
第一旅郑次先执行静态块里的A a = new A();
这会调用构造方法,此时。i和j默认都为0;然后i值变为10;
执行主方法,实例化对象。调用构造方法,此时i=10;j=0;
这下应该明白了吧。。