标签:
java尽量去保证每个变量在使用前都会得到初始化.
(只是类的数据成员会隐式初始化,这个我之前还真没有太在意,一直以为java默认的初始化是对所有类型的变量都生效的. )
显式初始化就不用说了. 很简单.
在构造方法中初始化变量是个很灵活的办法.但是,成员变量的隐式初始化是不会被阻止的.
public class Counter{
int i;
Counter(){
i=7;
}
}
这段代码,i会先被初始化为0,然后在构造方法中在被初始化为7;
一码解千愁,把这段代码放到eclipse中debug一下,就全明白了.
class Bowl{
Bowl(int marker){
System.out.println("Bowl("+marker+")");
}
public void f1(int marker){
System.out.println("f1("+marker+")");
}
}
class Table{
static Bowl bowl1 = new Bowl(1);
Table(){
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int marker){
System.out.println("f2("+marker+")");
}
static Bowl bowl2 = new Bowl(2);
}
class CupBoard{
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
CupBoard() {
System.out.println("CupBoard()");
bowl4.f1(2);
}
void f3(int marker){
System.out.println("f3("+marker+")");
}
static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization {
public static void main(String[] args) {
System.out.println("Create new CupBoard() in main");
new CupBoard();
System.out.println("Create new CupBoard() in main");
new CupBoard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static CupBoard cupboard = new CupBoard();
}
/*
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
CupBoard()
f1(2)
Create new CupBoard() in main
Bowl(3)
CupBoard()
f1(2)
Create new CupBoard() in main
Bowl(3)
CupBoard()
f1(2)
f2(1)
f3(1)
*/
埃大爷的总结显得更高端:
假设有一个Dog类
所有的成员变量初始化的语句都可以看作一个只有一条语句的初始化块. 那么带static关键字的可以看作静态初始化块,不带static关键字的,可以看作非静态初始化块.
static{
int i=0;
}
{
int j=0;
}
做个反向推论,既然单条语句的特殊的初始化块适用于埃大爷的原则,那么普通的初始化块也适用这个原则(这是多么无耻不负责任的推论…)
初始化顺序其实在上面都说完了. 为什么是这样的埃大爷也解释了. 小白总结就是:
按照埃大爷的解释,那静态初始化实在类装载的时候,而默认的初始化实在为实例分配空间的时候,那静态初始化块应该是早于默认初始化的. 不确定对不对,先记者,回头看到了再说.
标签:
原文地址:http://www.cnblogs.com/thecatcher/p/5843949.html