初始化块

来源:互联网 发布:淘宝商城赚钱的吗 编辑:程序博客网 时间:2024/05/01 10:05

      初始化块是Java类里可出现的第四种成员(前面依次有属性、方法和构造器),一个类里可以有多个初始化块。

      初始化块的作用与构造器的非常类似,它也可以对Java对象进行初始化操作。

      初始化块的语法格式如下:

       [修饰符]{

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

              ...

        }

        初始化块的修饰符只能是static,使用static修饰的初始化块称为静态初始化块。初始化块里的代码可以包含任何可执行语句,包括定义局部变量、调用其他对象的方法、使用分支、循环语句等。

       初始化块也是Java类的一种成员,但它没有名字,因此无法通过类、对象来调用初始化块。初始化块只在创建Java对象时隐式执行,而且在执行构造器之前执行。

      例如:

      public class Person{

            //下面定义一个初始化块

           {

                 int a=6;

                 if(a>4){

                        System.out.println("Person初始化块:局部变量a的值大于4");

                 }

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

            }

            //定义第二个初始化块

            {

                   System.out.println("Person的第二个初始化块”);

            }

           //定义无参数的构造器

            public Person(){

                   System.out.println("Person的无参数构造器");

             }

             public static void main(String[] args){

                   new Person();

              }

        }

      运行结果:

      Person初始化块:局部变量a的值大于4

      Person的初始化块

      Person的第二个初始化块

      Person的无参数构造器

     注意:虽然Java允许一个类里定义多个普通初始化块,但这没意义。因为初始化块时在创建Java对象时隐式执行的,而且它们总是全部执行,因此,完全可以把多个普通初始化块合并一个初始化块,从而让程序更加简洁。

      注意:当Java创建一个对象时,系统先为该对象的所有实例属性分配内存,接着程序开始对这些实例属性执行初始化。其初始化顺序是:先执行初始化块或生命属性时指定的初始值,再执行构造器里指定的初始值。

      与构造器不同的是,初始化块是一段固定执行的代码,它不能接受任何参数。因此初始化块对同一个类所有对象所进行的初始化处理完全相同。因此,如果有一段初始化处理代码对所有对象完全相同,且不接受任何参数,就可以把这段初始化代码提取到初始化块。

       与构造器类似,创建Java对象时,不进会执行该类的普通初始化块和构造器,系统会一直上溯到Object类,先执行Object类的初始化块,开始执行Object的构造器,依次向下执行其父类的初始化块,开始执行器父类的构造器...最后才执行该类的初始化块和构造器。

       除此之外,如果希望类加载后对整个类进行某些初始化操作,此时需要使用static关键字修饰初始化块,被称为静态初始化块。静态初始化块是类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行。因此静态初始化块总是比普通初始化块先执行。

      注意:静态初始化块也被称为类初始化块,也属于类的静态成员,同样遵循静态成员不能访问非静态成员的规则,因此静态初始化块不能访问非静态成员,包括不能访问实例属性和实例方法。

      执行顺序:先执行Object类的静态初始化块,在执行父类的静态初始化块...最后才执行该类的静态初始化块,经过这个过程,才完成了该类的初始化过程。只有当类初始化完成后,才可以在系统中使用这个类。