这直接来自http://www.programcreek.com/2011/10/java-class-instance-initializers/
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();
}
}
输出:
静态初始值设定项称为
实例初始化程序称为
构造函数称为
实例初始化程序称为
构造函数称为
2. Java实例初始化器如何工作?
上面的实例初始化器包含一个println语句。要了解其工作原理,我们可以将其视为变量赋值语句,例如b = 0
。这可以使理解更加明显。
代替
int b = 0
,你可以写
int b;
b = 0;
因此,实例初始值设定项和实例变量初始值设定项几乎相同。
3.实例初始化器什么时候有用?
实例初始化器的使用很少,但是在以下情况下,它仍然是实例变量初始化器的有用替代方法:
- 初始化程序代码必须处理异常
- 执行实例变量初始化器无法表达的计算。
当然,此类代码可以用构造函数编写。但是,如果一个类有多个构造函数,则必须在每个构造函数中重复代码。
使用实例初始化器,您只需编写一次代码,无论使用哪种构造函数创建对象,都将执行该代码。(我想这只是一个概念,并不经常使用。)
实例初始化器有用的另一种情况是匿名内部类,它根本不能声明任何构造函数。(这是放置日志记录功能的好地方吗?)
感谢德海因。
另请注意,实现接口[1]的匿名类没有构造函数。因此,在构造时需要实例初始化程序来执行任何类型的表达式。
public static void staticMethod(){}
,则可以执行TestStatic.class.getMethod("staticMethod");
。静态初始值设定项不会被调用。这里更多信息docs.oracle.com/javase/specs/jvms/se10/html/...