Java静态变量 静态代码块 主函数 成员变量 构造代码块 构造函数的执行顺序

时间:2021-09-23 19:29:33
一.static
1.静态代码块:
   代码在项目启动的时候就执行,这种代码是主动执行的,而且只执行一次。他常用做类属性的初始化。static{}
2.静态方法:
   在类加载的时候就已经加载,在类名调用时才执行,这种代码是被动执行的。
   注意:静态方法里只能调用同类中其他静态成员;
                   不能以任何方式引用this和super关键字,因为静态方法使用前不需创建任何对象实例,所以就不存在this。
3.静态变量:
  属于整个类的变量而不是某个对象,任何方法都不能声明static变量。

二.类的加载
1.什么时候加载
类的加载是通过类加载器(Classloader)完成的。
两种情况加载类: 只要有其它类引用了它就加载;等到 类初始化发生的时候才加载。应该跟不同jvm有关
 静态加载:new ClassName();编译时就提供
 动态加载:Class.forName("ClassName") ; 编译时可缺席
2.那什么时候初始化
 加载完类后类的初始化就会发生,会初始化所有静态成员。
4.加载顺序
  加载类时初始化顺序: 按顺序加载对象的静态属性--->再加载静态代码块--->加载类的主函数
 对象实例化时加载顺序: 加载对象的非静态属性--->非静态代码块--->构造方法
 有父类的情况:加载父类(初始化步骤)-->加载子类(初始化)-->加载父类(实例化)-->加载子类(实例化)

public class Test {
public static int k = 0;
public static Test t1 = new Test("t1");
public static Test t2 = new Test("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
{
print("构造块");
}
static {
print("静态块");
}
public Test(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
}
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}

public static void main(String args[]) {
Test t = new Test("init");
}
// 加载顺序 静态变量、成员变量加载,初始化为零。执行顺序 静态变量>静态代码块>主函数(静态方法)>成员变量>构造代码块>构造函数
}

  1.顺序加载类的静态属性(非静态不管)
  这里加载的是:public static int 0;
  然后加载:public static StaticTest t1 new StaticTest("t1");
  因为此处进行了类的实例化所以
  1.1加载类的非静态属性
  这里是:public int print("j"); 
》》》 1:j i=0 n=0
  1.2顺序加载类中的非static代码块(static暂时不加载)
  这里是:print("构造快");和print("静态块");
》》》 2:构造快 i=1 n=1
   3:静态块 i=2 n=2
  1.3加载类的构造方法
  这里是:public StaticTest(String str)
》》》 4:t1 i=3 n=3
 (一个静态属性的实例就完成了)
 *   然后 加载:public static StaticTest t2 new StaticTest("t2");  因为进行了类的实例化所以 重复(1.1-1.3)
》》》 5:j i=4 n=4
   6:构造快 i=5 n=5
   7:静态块 i=6 n=6
   8:t2 i=7 n=7
 *   然后 加载:public static int print("i");
》》》 9:i i=8 n=8
 *   然后 加载:public static int 99;  注意现在n为99了
 *  2.如果有static代码块,在这里先加载,这个里面没有
 *  3. 加载主函数
  这里加载的是:StaticTest new StaticTest("init");  因为进行了类的实例化所以 重复1.1-1.3
》》》 10:j i=9 n=99
   11:构造快 i=10 n=100
   12:静态块 i=11 n=101
   13:init i=12 n=102


转载自http://blog.sina.com.cn/s/blog_1552a7b490102w3xk.html