代码开发中书写的变量时,很少会留言成员变量初始顺序。那么这些成员变量初始化的顺序是有规则的or是随机的。下面以可能会影响到变量初始化顺序的几种类型来讨论。
sValue静态变量 sFinal静态常量 sBlock静态代码块
mValue-本地变量 mFinal本地常量 mBlock本地代码块
------------------------code begin----------------------------------
public class Test {
final String mFinal = testStack("mFinal");
String mValue = testStack("mValue");
static String sValue = testStack("sValue");
static final String sFinal = testStack("sFinal");
static {
testStack("sBlock");
}//sBlock
{
testStack("mBlock");
}//mBlock
public static String testStack(String test) {
Log.e("hjx", "hjxtest",new Exception(test));
return "test";
}
public Test() {
super();
testStack("Test");
}
}
------------------------code end----------------------------------
java.lang.Exception: sValue
java.lang.Exception: sFinal
java.lang.Exception: sBlock
java.lang.Exception: mFinal
java.lang.Exception: mValue
java.lang.Exception: mBlock
java.lang.Exception: Test
将代码变量反序排列运行
java.lang.Exception: sBlock
java.lang.Exception: sFinal
java.lang.Exception: sValue
java.lang.Exception: mBlock
java.lang.Exception: mValue
java.lang.Exception: mFinal
java.lang.Exception: Test
由以上两份LOG可以看到
1,静态变量&静态代码块 早于 本地变量&本地代码块。
2,静态变量&静态代码块 是按照书写先后来初始化的
3,本地变量&本地代码块 是按照书写先后来初始化的
由以上3点,按照没有初始化时变量无法使用,可以推测语法(类初始化过程中):
1,不能用 静态变量 初始化 本地变量
2,静态变量&静态代码块 间,需要先定义(按照书写顺序)才能使用
3,本地变量&本地代码块 间,需要先定义(按照书写顺序)才能使用
4,final 并不会优先初始化
--为什么静态变量必须早与本地变量初始化呢?这个通过类使用的顺序容易理解,使用到了类就必须要初始化静态变量,但是使用到类不一定会实例化类对象。
通过上面分析,大家可以猜测下,是否可以用没有定义(按照书写顺序)静态变量,来初始化 本地变量,如下语法是否报错:
String mValue = sValue;
static String sValue = "aaaa";