java static 关键字的理解
2018-12-18 本文已影响0人
六味帝皇丸
1.类的加载顺序:父类的静态变量--》父类的静态方法--》子类的静态变量--》子类的静态方法---》父类的成员变量---》父类的构造方法(如果有够造块,则在构造方法前执行)--》子类的成员变量--》子类的构造方法
2.static只会加载一次,所以通俗点讲第一次new的时候,所有的static都先会被全部载入(以后再有new都会忽略),进行默认初始化。在从上往下进行显示初始化。这里静态代码块和静态成员变量没有先后之分,谁在上,谁就先初始化
public class TestStatic {
private static int k = 0;
public static TestStatic t1 = new TestStatic("t1");
public static TestStatic t2 = new TestStatic("t2");
private static int i = print("i");
private static int n = 99;
public int j = print("j");
{
print("构造块");
}
static {
print("静态块");
}
private TestStatic(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
++i;
}
private static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
return ++n;
}
public static void main(String[] args) {
TestStatic t = new TestStatic("init");
}
}
上面main方法的运行顺序
- 执行int k =0;
- 执行new TestStatic("t1"); 他进去不初始化static成员变量,由new TestStatic("init");来初始化,先调用 public int j = print("j"); 执行pint 方法,再执行构块
再执行静态块,再执行构造方法
打印如下:
1:j i=0 n=0
2:构造块 i=1 n=1
3:t1 i=2 n=2
3.执行new TestStatic("t2"); 跟上面类似 ,打印如下:
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5
4.执行 static int i = print("i"); 打印如下:
7:i i=6 n=6
5.执行private static int n = 99;
6.执行 静态块 打印:
8:静态块 i=7 n=99
7.执行成员变量 int j = print("j");
9:j i=8 n=100
8.执行构造块,打印:
10:构造块 i=9 n=101
9.执行构造方法
11:init i=10 n=102