黑马程序员技术交流社区

标题: 面向对象---静态初始化块,普通初始化块,构造器的加载顺序 [打印本页]

作者: wuyong    时间: 2017-5-3 12:31
标题: 面向对象---静态初始化块,普通初始化块,构造器的加载顺序
初始化块:
  包括静态初始化块和普通初始化块。
  初始化块初是构造器的补充,初始化块总在构造器之前执行。
  初始化块的修饰词只能是static。
  系统可以使用初始化块来进行对象的初始化操作。
基本用法:
  如果有一段初始化处理代码对所有对象完全相同,且无需接收任何参数,就可把这段初始化处理代码提取到初始化中去。
优点:
  提高初始化代码的复用,提高应用的维护性。
 
下面代码主要说明静态初始化块,普通初始化块,构造器的加载顺序:
//三个继承关系的类
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的无参构造器
     */
}
作者: 范德华丽    时间: 2017-5-4 00:04
谢谢分享....
作者: 654788808    时间: 2017-5-4 08:06
#在这里快谢谢分享...速回复#
作者: 小全    时间: 2017-5-4 12:44
复习一下,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2