在本篇文章,我将会使用一个例子展示什么是实例变量初始化块,实例初始化块和静态初始化块,然后说明在Java中实例初始化块是如何工作的。

执行顺序

查看下面的代码,你知道哪个先执行吗?

package simplejava;

class Foo {
// instance variable initializer
String s = "abc"; // constructor
public Foo() {
System.out.println("constructor called");
} // static initializer
static {
System.out.println("static initializer called");
}
// instance initializer
{
System.out.println("instance initializer called");
}
} public class Q27 { public static void main(String[] args) {
new Foo();
new Foo();
} }

结果输出;

static initializer called
instance initializer called
constructor called
instance initializer called
constructor called

实例初始化块是如何工作的

上面的实例初始化块包含了一个打印语句。为了理解它是如何工作的,我们可以将它看成一个变量赋值语句,如b=0,这样理解起来会更简单。

int b=0,可以写成 int b; b=0;

因此,实例初始化块与实例变量初始化块基本类似。

什么时候使用实例初始化块

实例初始化块很少使用,但是在以下情况,它可以作为实例变量初始化块的替代:

  1. 初始化代码需要处理异常;
  2. 执行计算,这些计算不能通过实例变量初始化块表示;

当然,这些代码也可以写在构造方法,但是一个类如果有多个构造方法,你需要在每个构造方法重复写上这些代码。

如果使用实例初始化块,仅仅只需要写一次,无论你使用哪个构造方法创建类,它都会执行。(我认为这是一个不经常使用的概念。)

另一种情况是匿名内部类,由于其不能声明构造方法,实例初始化块非常有用。(这个地方放置日志函数是否合适?)

感谢Derhein。

实现接口的匿名类没有构造方法,因此实例初始化块替代构造方法,在对象构造期间执行各种表达式。

译文链接:http://www.programcreek.com/2011/10/java-class-instance-initializers/

什么是Java实例初始化块的更多相关文章

  1. java实例初始化块

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

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

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

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

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

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

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

  5. Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)

    1.执行顺序 1.1.一个类中的初始化顺序 类内容(静态变量.静态初始化块) => 实例内容(变量.初始化块.构造器) 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)= ...

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

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

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

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

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

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

  9. Java笔记: 初始化块

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

随机推荐

  1. 一些C#实用的方法汇总

    代码如下: /// <summary> /// 过滤字符串方法,用于将单引号等特殊符号转化成中文符号 /// </summary> /// <param name=&qu ...

  2. 利用chrome调试JavaScript代码

    看见网上很多人问怎么用chrome调试JavaScript代码,我也对这个问题抱着疑问,但是没有找到一篇能用的中文文章(可能我的google有问题),也不知道怎么点出一篇E文的,感觉作者写得不错,所以 ...

  3. [小工具]CSS内嵌样式自动提取器

    逐行分析,将内联样式提取出来,并自动编号代替的一个小工具软件 注:style=""(此处必须是标准的双引号!) http://files.cnblogs.com/quejuwen/ ...

  4. js设置和读取cookie

    /*path参数:表示cookie所在的目录,.net默认为/(根目录).在同一个服务器上有目录如下:/test/,/test/aa/,/test /bb/,现设一个cookie1的path为/tes ...

  5. 项目总结笔记系列 wsTax KT Session1

     项目总结笔记 1.专有名词解释: SMO, Separate Management Office. UAT, User Accept Test. GSLB, Global Server Load B ...

  6. 新一代编程:scala泛函编程技术-唠叨

    准备了半年后,终于决定在这里开始我的scala编程技术学习体验撰写之旅.初步打算在这里把我学习.体验.掌握scala编程的过程与有兴趣的朋友分享.我想,虽然我这不是正式论文或者教课书之类的,但写个开场 ...

  7. oracle linux 启动

    [oracle@dg1 ~]$ sqlplus /nolog SQL*Plus: Release 10.2.0.1.0 - Production on Mon May 11 12:51:24 2009 ...

  8. DOM相关知识点以及原型

    DOM(增删改查): 查询 1.获取元素 1.1标准DOM API document.getElementById document.getElementsByTagName document.get ...

  9. css知多少(1)——我来问你来答

    1. 引言 各位前端或者伪前端(比如作者本人)的同志们,css对你们来说不是很陌生.比如我,在几年之前上大学的时候,给外面做网站就用css,而且必须用css.这样算下来也得六年多了,有些功能可能轻车熟 ...

  10. jScrollPane 美化滚动条

    在线实例 滚动条可见 滚动条隐藏 使用方法 <div class="container"> <h1>滚动条可见</h1> <div cla ...