400-616-5551

您所在位置: 首页> 学习课程> Java学习篇:初始化块

Java学习篇:初始化块

发布百知教育 来源:学习课程 2020-02-26

1.什么是初始化块

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

2.使用初始化块

初始化块是Java类里可出现的第4种成员(前面依次有Field、方法和构造器)。

语法:

 [修饰符] {     // todo 可执行性代码 }

@注意:

  • 一个类里可以有多个初始化块,相同类型的初始化块之间有顺序:前面定义的初始化块先执行,后面定义的初始化块后执行。

  • 初始化块的修饰符只能是static,使用static修饰的初始化块被称为静态初始化块。

  • 初始化块里的代码可以包含任何可执行性语句,包括定义局部变量、调用其他对象的方法,以及使用分支、循环语句等。

  • 初始化块虽然也是Java类的一种成员,但它没有名字,也就没有标识,因此无法通过类、对象来调用初始化块。

  • 初始化块只在创建Java对象时隐式执行,而且在执行构造器之前执行

示例

定义一个类,然后实例化该类

  1. package com.hui.javalearn.classes;


  2. /**

  3. * description : 初始化块使用

  4. *

  5. * @author : Mr.Liuqh

  6. * @date : 2019-12-31 11:57

  7. */

  8. public class StaticUseOne {

  9.    /**

  10.    *  定义一个静态成员

  11.    */

  12.    private  int num;


  13.    /*

  14.    * 定义第一个初始化块

  15.    */

  16.    {

  17.        // 对成员变量赋值

  18.        num = 11;

  19.        System.out.println("第一个初始化块,输出: " + num);

  20.    }


  21.    /*

  22.     * 定义第二个初始化块

  23.     */

  24.    {

  25.        System.out.println("第二个初始化块,输出: " + num);

  26.    }


  27.    /**

  28.    *  无参构造方法

  29.    */

  30.    public StaticUseOne(){

  31.        System.out.println("无参构造方法输出: " + num);

  32.    }


  33. }


  34. ...


  35. // 测试

  36. new StaticUseOne();


  37. /*

  38. 输出:

  39. 第一个初始化块,输出: 11

  40. 第二个初始化块,输出: 11

  41. 无参构造方法输出: 11


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

3.静态初始化块

如果定义初始化块时使用了static修饰符,则这个初始化块就变成了静态初始化块,也被称为类初始化块。

静态初始化块是类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行。因此静态初始化块总是比普通初始化块先执行。

示例

  1. package com.hui.javalearn.classes;


  2. /**

  3. * description : 静态初始化块使用

  4. *

  5. * @author : Mr.Liuqh

  6. * @date : 2019-12-31 11:57

  7. */

  8. public class StaticUseTwo {

  9.    /**

  10.    *  定义一个静态成员

  11.    */

  12.    private static int num;


  13.    /**

  14.     *  定义一个非静态成员

  15.     */

  16.    private int total;


  17.    /*

  18.     * 定义一个初始化块,

  19.     *

  20.     * 注意: 虽然它是第一个被定义的初始化块,但不会第一个执行。

  21.     */

  22.    {

  23.        // 给非静态成员赋值

  24.        total = 100;

  25.        System.out.println("这是一个非静态初始化块,输出: num = " + num);

  26.        System.out.println("这是一个非静态初始化块,输出: total = " + total);

  27.    }


  28.    /*

  29.    * 定义第一个静态初始化块

  30.    *

  31.    * 注意: 会第一个执行!!

  32.    */

  33.    static {

  34.        // 对静态成员变量赋值

  35.        num = 11;

  36.        System.out.println("这是一个静态初始化块,输出: " + num);

  37.    }


  38.    /**

  39.    *  无参构造方法

  40.    */

  41.    public StaticUseTwo(){

  42.        System.out.println("无参构造方法输出: " + num);

  43.    }


  44. }


  45. // 测试

  46. new StaticUseTwo();


  47. /*

  48. 输出:

  49. 这是一个静态初始化块,输出: 11

  50. 这是一个非静态初始化块,输出: num = 11

  51. 这是一个非静态初始化块,输出: total = 100

  52. 无参构造方法输出: 11


4.总结

  • 静态初始化块总是比普通初始化块先执行。

  • 静态初始化不能访问非静态成员,也不能访问实例Field和实例方法。

5.使用场景

从某种程度上来看,初始化块是构造器的补充,初始化块总是在构造器执行之前执行。

与构造器不同的是,初始化块是一段固定执行的代码,它不能接收任何参数。因此初始化块对同一个类的所有对象所进行的初始化处理完全相同。基于这个原因,不难发现初始化块的基本用法,如果有一段初始化处理代码对所有对象完全相同,且无须接收任何参数,就可以把这段初始化处理代码提取到初始化块中.

示例如果两个构造器中有相同的初始化代码,这些初始化代码无须接收参数,就可以把它们放在初始化块中定义,如下图所示:


java培训班





java培训班:http://www.baizhiedu.com/java2019

 




上一篇:JAVA培训班:Java安装与VS Code环境配置

下一篇:it培训班出来的学员怎么样?IT培训学校好么?

相关推荐

关闭

立即申请

www.baizhiedu.com