初始化块

来源:互联网 发布:软件开发模式包括 编辑:程序博客网 时间:2024/04/28 02:13


初始化块与构造方法的作用很相似,他们都用于对Java对象执行指定的初始化块操作,但两者之间仍然存在着差异。具体差异在于:初始化块是一段固定的执行代码,他不能接收任何参数,因此初始化块对同一个类内的属性所进行的初始化处理完全相同;如果多个构造方法里有相同的初始化块,这些初始化代码无需接受参数,那就可以把他们放在初始化中定义。通过把多个构造方法中相同的代码提取到初始化块中定义,能更好的提高初始化块的复用,提高应用的可维护性

与构造方法类似,创建一个Java对象时,不仅会执行该类的初始化块和构造方法,系统还会一直追溯到java.lang.Object类,先执行java.lang.Object类的初始化块,执行java.lang.Object的构造方法,然后依次向下执行父类的初始化块,执行其父类的构造方法….最后才执行给类的初始化块和构造方法,返回该类的对象

如果希望类加载后对整个类执行某些初始化操作,则需要使用static关键字来修饰初始化块,使用static修饰的初始化块呗称为静态初始化块,静态初始化块是类相关的,静态初始化块必普通初始化块先执行

编写程序,创建Father,Me,Sun3个类,这三个类都提供了静态初始化块和普通初始化块,并且Me类里还是用了this调用重载构造方法,而Sun使用了super显示调用父类指定的构造方法,代码如下:

class Father{

    static {

       System.out.println("老爸的初始化块");

    }

    {

       System.out.println("老爸的普通初始化块");

    }

   

       public Father(){

           System.out.println("老爸的无参构造方法");

       }

   

}

class Me extends Father{

    static{

       System.out.println("我的静态初始化块");

    }

    {

       System.out.println("我的普通初始化块");

    }

    public Me(){

       System.out.println("我的无参数构造方法");

    }

    public Me(String s){

       this();

       System.out.println("我的带参数构造方法,参数是"+s);

    }

   

   

}

class Sun extends Me{

   

    static{

       System.out.println("儿子的静态年初始化块");

    }

    {

       System.out.println("儿子的普通初始化块");

    }

    public Sun(){

       super("哥想你了");

       System.out.println("哥真的想你啦");

    }

   

}

public class staticTest {

 

    public static void main(String[] args) {

       new Sun();

       new Sun();

    }

 

}

执行结果是:

 

老爸的初始化块

我的静态初始化块

儿子的静态年初始化块

老爸的普通初始化块

老爸的无参构造方法

我的普通初始化块

我的无参数构造方法

我的带参数构造方法,参数是哥想你了

儿子的普通初始化块

哥真的想你啦

老爸的普通初始化块

老爸的无参构造方法

我的普通初始化块

我的无参数构造方法

我的带参数构造方法,参数是哥想你了

儿子的普通初始化块

哥真的想你啦

第一次创建一个Sun对象时,因为系统中还不存在Sun类,因此需要先加载并初始化,初始化Sun类时先执行顶层父类的静态初始化块,然后执行其直接父类的静态初始化块,最后才只i系那个Sun本身的静态初始化块,一旦Sun类初始化成功,Sun类在该虚拟机里将会一直存在,因此当第二次创建Sun实例时无需再次对Leaf类进行初始化

 


原创粉丝点击