JVM类加载:先初始化,再赋初值,在这个基础上:从上往下先执行静态的赋值语句或初始化块,遇到n创建对象的时候,从上往下执行非静态的赋值或者初始化块,最后执行构造函数。
目录
一、知识基础
1.静态块:
static{
System.out.println("This is a 静态块");
}
- 执行时间:类加载时只执行一次,时间上优先于主函数 ;
- 存储区域:静态代码块中声明的变量或对象以及静态变量和对象的句柄存在于方法区中;
2.普通块:
{
System.out.println("This is a 普通块");
}
- 执行时间:每次new对象时运行,会先执行普通块, 再执行构造方法;
- 执行目的:普通块用于统一初始化所有该类对象,构造函数用于初始化当前对象;
3. 变量和赋值是拆分执行的:即先执行句柄信息声明变量,再执行赋值语句;看这个例子输出啥?
public class StudentLink {
{
System.out.println(this.n);
n=100;
System.out.println(this.n);
}
private int n = 99;
public static void main(String[] args) {
StudentLink test = new StudentLink();
System.out.println(test.n);
}
}
输出:
0
100
99
二、魔鬼实战
然后基于上面的规律,看懂这个例子:
package com.myr.test;
public class InitializeDemo {
private static int k = 1;
private static InitializeDemo t1 = new InitializeDemo("t1");
private static InitializeDemo t2 = new InitializeDemo("t2");
private static int i = print("i");
static{
print("静态块");
n=100;
}
private static int n = 99;
{
print( "枸造块");
j=100;
}
private int j = print("j");
public static int print(String str) {//静态方法只有调用的时候才执行
System.out. println((k++) + ":"+ str + " i="+i+" n="+ n);
++n;
return ++i;
}
public InitializeDemo(String str) {
System.out.println((k++) + ":"+ str+" i="+i+" n="+ n);
++i;
++n;
}
public static void main(String[] args) {
InitializeDemo n =new InitializeDemo( "初始化");
}
}
输出:
1:枸造块 i=0 n=0
2:j i=1 n=1
3:t1 i=2 n=2
4:枸造块 i=3 n=3
5:j i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=7
9:枸造块 i=8 n=99
10:j i=9 n=100
11:初始化 i=10 n=101

1万+

被折叠的 条评论
为什么被折叠?



