Java语言提供了很多类初始化的方法,包括构造器、初始化器等。除了这两种方法之外,我们还可以用初始化块(initialization block)来实现初始化功能。

基本语法

初始化块是出现在类声明中的语句块,它位于所有成员、函数、构造器之外。例如使用静态初始化块,我们的HelloWorld可以这么写:

public class Hello {
static {
System.out.println("Hello, world!");
}
public static void main(String[] args) { }
}

初始化块的执行时机

首先,初始化器和初始化块会按照出现顺序依次执行。之后,构造器的代码开始执行。以下的示例包含了三种初始化的方式,并且刻意安排了顺序。

public class Init {
Say hello = new Say("hello");
Say world = new Say("world"); {
new Say("static block");
} Init() {
System.out.println("Construction complete.");
} Say bye = new Say("Bye!"); public static void main(String[] args) {
Init i = new Init();
}
} class Say {
Say(String s) {
System.out.println(s);
}
}

以下输出结果展示了对象初始化代码的执行顺序:

$ java Init
hello
world
static block
Bye!
Construction complete.

对于静态初始化块,JVM保证它在类加载之后、实际使用之前被执行,一次。

常见场景

尽管初始化器和构造器已经可以满足大多数初始化的需求,在几种场景下初始化块还是非常有用的。

  • 存放所有构造器都包含的通用代码,从而减少重复代码。
  • 为匿名内部类初始化,因为它们无法定义构造器(它们甚至连名字都没有)。
  • 用静态初始化块为静态成员执行较为复杂的初始化工作。

Java笔记: 初始化块的更多相关文章

  1. Java笔记 —— 初始化

    Java笔记 -- 初始化 h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: red !impo ...

  2. Java的初始化块及执行过程详解

    问题:Java对象初始化方式主要有哪几种?分别是什么?针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式. 还有一种与构造器作用非常相似的是初始化块, ...

  3. java静态初始化块的执行顺序

    先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...

  4. Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究

    Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, ...

  5. 什么是Java实例初始化块

    在本篇文章,我将会使用一个例子展示什么是实例变量初始化块,实例初始化块和静态初始化块,然后说明在Java中实例初始化块是如何工作的. 执行顺序 查看下面的代码,你知道哪个先执行吗? package s ...

  6. java中初始化块、静态初始化块和构造方法

    (所谓的初始化方法init()是另一回事, 在构造方法之后执行, 注意不要混淆) 在Java中,有两种初始化块:静态初始化块和非静态初始化块.它们都是定义在类中,用大括号{}括起来,静态代码块在大括号 ...

  7. java实例初始化块

    实例初始化程序块用于初始化实例数据成员. 它在每次创建类的对象时运行.实例变量的初始化可以是直接的,但是可以在初始化实例初始化块中的实例变量时执行额外的操作. 什么是实例初始化块的使用,我们可以直接分 ...

  8. java静态初始化块(静态域)

    1. 类变量的初始化可通过静态初始化块来进行. 代码放在一对大括号内,大括号前用static修饰:static {……} 一个类可定义1个或多个静态初始化块. 静态初始化块会在加载时调用而且只被调用一 ...

  9. Java 静态初始化块等的执行顺序

    实例代码 package text; class Root { static{ System.out.println("Root的静态初始化块"); } { System.out. ...

随机推荐

  1. C++:面向对象的相关概念

    对象: 一般意义上的对象:是现实世界中一个实际存在的事物 面向对象方法中的对象:是系统中用来描述客观事物的一个实体 抽象与分类: 分类所依据的原则:抽象 抽象出同一类对象的共同属性和行为,形成类 类与 ...

  2. 第一个Tornado程序

    环境:Python3.8 系统:win10 1903 工具:pycharm2019.3 import tornado.web # web服务基本功能都封装在此模块中 import tornado.io ...

  3. vue element 时间选择器设置禁用日期

    在 el-date-picker 组件中有一个 picker-options 属性 disabledDate 可以设置日期的可选范围 <el-date-picker v-model=" ...

  4. Django--redis 保存session

    pipenv install django-redis settings.py: # 作为 cache backend 使用配置 使用redis保存session CACHES = { "d ...

  5. IDEA中打war 包

    把war 放入tomcat 的 webapps 目录下,重启tomcat即可自动解压war包跑起来 (最好是,解压完成后,关闭tomcat,把war包拷贝出去,再启动,不然每次启动tomcat都会自动 ...

  6. Hadoop大实验——MapReduce的操作

    日期:2019.10.30 博客期:114 星期三 实验6:Mapreduce实例——WordCount   实验说明: 1.          本次实验是第六次上机,属于验证性实验.实验报告上交截止 ...

  7. 一文解读XaaS (转)

    艾克赛斯???别慌,读完你就知道啦~ 服务和云服务 了解Xaas云服务,不妨从了解服务开始. “服务”在本质上是一种租赁,它对资源的占用方式是“为我所用”而非“为我所有”,对资源的消费模式是按需付费而 ...

  8. DoMes平台首页菜单栏

    问题1:左侧菜单栏数据是在哪里获取的? 答案1: 项目根目录的Views/Home/Index文件为平台首页 打开Index.cshtml文件,有一个framework-clientdata.js引入 ...

  9. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  10. HTML元素和测试用例的简要介绍

    HTML和CSS的基本语法就不出教程,线下自己看电子书即可 HTML元素 标签 内容 属性 标签+内容+属性 <html> <head> <title>我的主页&l ...