当前位置 主页 > 网站技术 > 代码类 >

    Java初始化块及执行过程解析

    栏目:代码类 时间:2019-09-17 11:08

    问题:Java对象初始化方式主要有哪几种?分别是什么?

    针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式。

    还有一种与构造器作用非常相似的是初始化块,它可以对Java对象进行初始化操作。下面主要阐述Java的初始化块及执行过程。

    Java初始化块其实是Java类的成员之一,其语法格式如下:

    [修饰符]{

      //初始化块的可执行代码

      ...

    }

    初始化块的修饰符只能是static,使用static修饰符的初始化块称为静态初始化块,后面会介绍到。

    下面通过一段程序代码看看创建对象Dog时发生了什么。

    public class Dog {  //定义一个初始化块  {    System.out.println("第一个初始化块");  }  //定义第二个初始化块  {    System.out.println("第二个初始化块");  }  //定义无参的构造器  public Dog() {    System.out.println("Dog的无参构造器");  }    public static void main(String[] args) {        new Dog();  }}

    运行结果为:

    第一个初始化块第二个初始化块Dog的无参构造器

    从运行结果可以看出:当创建一个Dog对象时,程序先执行初始化块后执行构造器,而且两个初始化的执行顺序是按照前后顺序执行的。

    由于初始化块只在创建Java对象时隐士的执行(所有的初始化块全部执行),为了让程序更加的简洁和可读性更强,一般一个类里最多只有一个初始化块。

    既然初始化块和构造器都是创建对象的时候执行,那么它们有什么区别呢?

    从某种程度上来看,初始化块是构造器的补充,与构造器不同的是,初始化块是一段固定执行的代码,不能接收任何的参数,而构造器是可以接收参数的。如果程序中有两个构造器,并且它们有公共的无需接收参数的代码,则可以把这些相同的公共代码放到初始化块中,提高代码的可维护性。

    当普通初始化块被static修饰时,则这个初始化块就是静态初始化块,也被称为类初始化块。

    普通初始化块负责对对象进行初始化,而静态初始化块负责对类进行初始化,所以静态初始化块总是比普通初始化块先执行。

    静态初始化块通常用于对类变量执行初始化处理,不能对实例变量进行初始化处理。

    静态初始化块也是类的静态成员,仍然需要遵循静态成员不能访问非静态成员的规则,包括不能访问实例变量和实例方法。

    初始化块执行的时候会一直上溯到java.lang.Object类,先执行Object的初始化块,再执行其父类的初始化块...最后才执行该类自己的初始化块。

    下面看下这段代码的执行顺序结果:

    class Biology{  static {    System.out.println("Biology的静态初始化块");  }  {    System.out.println("Biology的普通初始化块");  }  public Biology(){    System.out.println("Biology的无参构造器");  }}class Animal extends Biology{  static {    System.out.println("Animal的静态初始化块");  }  {    System.out.println("Animal的普通初始化块");  }  public Animal(){    System.out.println("Animal的无参构造器");  }  public Animal(String name){    this();//调用同类中的重载构造器    System.out.println("Animal的带参构造器,name="+name);  }}class Cat extends Animal{  static {    System.out.println("Cat的静态初始化块");  }  {    System.out.println("Cat的普通初始化块");  }  public Cat(){    //调用父类中带参数的构造器    super("Java典籍");    System.out.println("Cat的无参构造器");  }}public class Test {  public static void main(String[] args) {    new Cat();    System.out.println("=========");    new Cat();  }}