Java基础——初始化块

来源:互联网 发布:影视包装培训软件 编辑:程序博客网 时间:2024/05/17 02:52

Java使用构造器对单个对象进行初始化操作,使用构造器先完成整个Java对象的状态初始化,然后将Java对象返回给程序,从而让该Java对象的信息更加完整。与构造器作用非常类似的是初始化块,它也可以对Java对象进行初始化操作。

一、 使用初始化块
初始化块是Java类里出现的第4种成员(前面依次有成员变量、方法和构造器),一个类里可以有多个初始化块,相同初始化块之间有顺序:前面定义的初始化块先执行,后面定义的初始化块后执行。初始化块的语法格式如下:

[修饰符] {    //初始化块的可执行代码    ...}

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

下面一个程序定义了一个Person类,它既包含了构造器,也包含了初始化块。下面看看程序在程序中创建Person对象时发生了什么。

public class Person{    //下面定义一个初始化块    int a = 6;    if(a > 4)    {        System.out.println("局部变量a的值大于4");    }    System.out.println("Person的初始化块");}//定义第二个初始化块{    System.out.println("Person的第二个初始化块");}//定义无参数的构造器{    System.out.println("Person类的无参数构造器");}public static void main(String[] args){    new Person():}

输出结果:
局部变量a的值大于4
Person的初始化块
Person的第二个初始化块
Person类的无参数构造器

运行结果可以看出,当创建Java对象时,系统总是先调用该类里定义的初始化块,如果一个类里定义了2个普通初始化块,则前面定义的初始化块先执行,后面定义的初始化块后执行。

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

看如下代码:

public class InstanceInitTest{    //先执行初始化块将a实例变量赋值为6    {        a = 6;    }    //先执行a实例变量赋值为9    int a = 9;    public static void main(String[] agrs)    {        //下面将输出9        System.out.println(new InstanceInitTest().a);    }}

上面程序中定义了两次对a实例变量赋值,执行结果是a实例变量的值为9,这表明int a = 9这行代码比初始化块后执行。但如果将粗体字初始化块代码与int a = 9顺序调换一下,将可以看到程序输出InstanceInitTest的实例变量a的值为6,这是由于初始化块中代码再次将a实例变量的值设为6。

二、初始化块和构造器
从某种程度来看,初始化块是构造器的补充,初始化块总是在构造器执行之前执行。系统使用初始化块来进行对象的初始化操作

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

基于这个原因,不难发现初始化块的基本用法,如果有一段初始化处理代码对所有对象完全相同,且无需接受任何参数,就可以把这段初始化代码提取到初始化块中。

注意:
实际上初始化块是一个假象,使用javac命令编译Java类后,该Java类中的初始化块会消失——初始化块中代码会被“还原”到每个构造器中,且位于构造器所有代码的前面。

三、静态初始化块
如果定义初始化块时使用了static修饰符,则这个初始化块就变成了静态初始化块,也被称为类初始化块(普通初始化块负责对对象进行初始化,类初始化块则负责对类进行初始化)。静态初始化块是类相关的,系统将在类初始化阶段进行静态初始化块,而不是在创建对象时候才执行。因此静态初始化总是比普通初始化块先执行

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

0 0
原创粉丝点击