首页 > 代码库 > 面向对象---静态初始化块,普通初始化块,构造器的加载顺序

面向对象---静态初始化块,普通初始化块,构造器的加载顺序

初始化块:

  包括静态初始化块和普通初始化块。

  初始化块初是构造器的补充,初始化块总在构造器之前执行。

  初始化块的修饰词只能是static。

  系统可以使用初始化块来进行对象的初始化操作。

基本用法:

  如果有一段初始化处理代码对所有对象完全相同,且无需接收任何参数,就可把这段初始化处理代码提取到初始化中去。

优点:

  提高初始化代码的复用,提高应用的维护性。

 

下面代码主要说明静态初始化块,普通初始化块,构造器的加载顺序:

/**
 * 
 * @author wuyong
 * @email 382999338@qq.com
 * @date2016年10月29日下午4:13:45
 */
//三个继承关系的类
public class A {
    static{
        System.out.println("A的静态初始化块");
    }
    {
        System.out.println("A的普通初始化块");
    }
    public A() {
        System.out.println("A的无参构造器");
    }
}


public class B extends A{

    static{
        System.out.println("B的静态初始化块");
    }
    {
        System.out.println("B的普通初始化块");
    }
    public B() {
        System.out.println("B的无参构造器");
    }
    public B(String string) {
        //通过this调用本类中的重载的构造器
        this();
        System.out.println("B的有参构造器,他的参数构造值string="+string);
    }

}


public class C extends B{
    static{
        System.out.println("C的静态初始化块");
    }
    {
        System.out.println("C的普通初始化块");
    }
    public C() {
        super("传入B有参构造器的的参数");
        System.out.println("C的无参构造器");
    }
    
    /*
     * 初始化化块、构造器在继承关系的执行顺序:
     * 都不仅会执行本类中的初始化化块、构造器,
     * 也会上溯到Object类,先执行Object的初始
     * 化化块、构造器,然后在执行其父类的。。。
     * 最后才会执行自身的初始化化块、构造器。
     * 
     * 
     * 第一次创建C对象,因为系统中还不存在C类,因此需要先加载并初始化C类,
     * 初始化C类时会先执行其顶层的父类的静态初始化块,在执行其直接父类的
     * 静态初始化块,最后在执行C本身的静态初始化块。
     * C类初始化成功后,C类在该虚拟机里将一直存在,所以第二次创建C类的对象
     * 时不要在在对C类进行初始化,就不要再执行静态初始化块。
     * 
     */
    public static void main(String[] args) {
        System.out.println("第一次创建C的对象----");
        new C();
        System.out.println("第二次创建C的对象----");
        new C();
    }
    /*
     * 输出结果:
     * A的静态初始化块
        B的静态初始化块
        C的静态初始化块
        第一次创建C的对象----
        A的普通初始化块
        A的无参构造器
        B的普通初始化块
        B的无参构造器
        B的有参构造器,他的参数构造值string=传入B有参构造器的的参数
        C的普通初始化块
        执行C的无参构造器
        第二次创建C的对象----
        A的普通初始化块
        A的无参构造器
        B的普通初始化块
        B的无参构造器
        B的有参构造器,他的参数构造值string=传入B有参构造器的的参数
        C的普通初始化块
        执行C的无参构造器
     */
}

 

面向对象---静态初始化块,普通初始化块,构造器的加载顺序