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

一.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 k = 0;
 *  然后加载:public static StaticTest t1 = new StaticTest("t1");
 *  因为此处进行了类的实例化所以
 *  1.1加载类的非静态属性
 *  这里是:public int j = 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 i = print("i");
》》》 9:i i=8 n=8
 *   然后 加载:public static int n = 99;  注意现在n为99了
 *  2.如果有static代码块,在这里先加载,这个里面没有
 *  3. 加载主函数
 *  这里加载的是:StaticTest t = 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

猜你喜欢

转载自blog.csdn.net/csdn9988680/article/details/78236196