在这篇文章中,首先用一个例子来说明什么是实例变量的初始化,实例初始化和静态初始化。然后再解释实例初始化是怎样运行的。
1.执行顺序
看看下面的类,你知道哪一个最先被执行?
public 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 static void main(String[] args) {
new Foo();
new Foo();
}
}
输出:
static initializer called
instance initializer called
constructor called
instance initializer called
constructor called
2.Java实例初始化是怎样运行的?
上面的实例初始化包含一个print语句。要了解它是如何运行的,我们可以把它作为一个变量赋值语句(例如b = 0),那么这将不难理解。
而不是
int b = 0
,你可以写成
int b;
b = 0;
3.实例初始化什么时候有用?
使用实例初始化是罕见的,但它仍然可以成为有用的替代实例变量初始化的一个选择,如果:
(1)初始化代码必须处理异常;
(2)执行无法用实例变量初始化来的计算。
当然,这样的代码可以写在构造函数里。但是,如果一个类有多个构造函数,你就必须在每个构造函数里重复这段代码。
用实例初始化,你可以只编写一次代码,无论什么构造函数被用来创建对象,都将会被执行。(我想这只是一个概念,它没有经常被使用。)
还有一种实例初始化很有用的情况是是匿名内部类,不能声明任何构造函数。(这会是放置日志功能的一个好地方呢?)
相关文章:
Object initialization in Java
原文:
What is Instance Initializer in Java?