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. android 支持上拉加载,下拉刷新的列表控件SwipeRefreshLayout的二次封装

    上拉加载,下拉刷新的列表控件,大家一定都封装过,或者使用过 源代码,我会在最后贴出来 这篇代码主要是为了解决两个问题 1.滑动冲突得问题 2.listview无数据时,无数据布局的展示问题 下方列出的 ...

  2. ios中使用socket实现聊天

    [iOS]SocketRocket简单实现聊天室功能 https://www.jianshu.com/p/db34940f1135      CocoaAsyncSocket   https://gi ...

  3. 攻防世界Web进阶-Upload1

    进入题目 题目提示上传文件,准备好一句话木马. 发现只能上传图片文件,那么再准备一个图片的一句话木马.上传. 浏览器开代理,使用burpsuite拦截,修改文件后缀名为php,否则无法连接 使用蚁剑连 ...

  4. LXML解析html代码和文件

    from lxml import etree text = """ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...

  5. 六 Spring属性注入的四种方式:set方法、构造方法、P名称空间、SPEL表达式

    Spring的属性注入: 构造方法的属性注入 set方法的属性注入

  6. 碰到的问题——建设基于TensorFlow的深度学习环境

    1.解决jupyter notebook问题:socket.error: [Errno 99] Cannot assign requested address 首先要生成一个jupyter的配置文件: ...

  7. Linux centos7 Linux网络相关、firewalld和netfilter、netfilter5表5链介绍、iptables语法

    一. Linux网络相关 yum install net-tools ifconfig查看网卡ip ifup ens33开启网卡 ifdown ens33关闭网卡 设定虚拟网卡ens33:0 mii- ...

  8. 常用的UI控件

    关于本文:作为一名iOS软件工程师,熟练规范的使用常用的UI控件是必备的基础技能. 指示器(UIActivityIndicatorView)----转动的等待小菊花 提醒对话框(UIAlertView ...

  9. 论文写作+gnuplot制图

    一:论文写作 论文写作推荐使用LATEX+TEXStudio+TEXLive 1.CTeX官方网站:http://www.ctex.org/HomePage ,他类似于python环境 2.TeXst ...

  10. 三 传递包装pojo&ResultMap

    传递包装pojo: 将实体类对象封装在QueryVo类中进行操作 mapper接口: mapper映射文件: 测试: ResultMap的使用: type:映射成的pojo类型 id:resultMa ...