静态变量初始化方式:
1.声明时初始化;
2.静态块中初始化;
测试:
package com.skymr.learn;
/**
* 静态变量初始化顺序测试
* @author skymr
*
*/
public class InstanceTest2 {
static int b = 11;
static{
a = 20;
b = 22;
}
static int a = 10;
public static void main(String[] args) throws Exception{
System.out.println("a="+InstanceTest2.a);
System.out.println("b="+InstanceTest2.b);
}
}
结果:
a=10
b=22
测试证明:1,2的先后顺序依靠代码的前后排列
问题:静态变量的初始化是什么时候开始的呢?
package com.skymr.learn;
/**
* 静态变量初始化顺序测试
* @author skymr
*
*/
public class InstanceTest2 {
static int b = 11;
static{
System.out.println("静态块");
a = 20;
b = 22;
}
static int a = 10;
public static void nop(){
}
}
Main方法移出来了
package com.skymr.learn;
public class MainTest {
public static void main(String[] args) throws Exception{
System.out.println("main方法开始"); //step1
InstanceTest2.nop();//step2
System.out.println("main方法开始--");//step3
System.out.println("a="+InstanceTest2.a);
System.out.println("b="+InstanceTest2.b);
}
}
打印结果:
main方法开始
静态块
main方法开始--
a=10
b=22
分析:执行step1时InstanceTest2类还没有装载进内存,也就没有运行它的静态块代码;
当调InstanceTest2.nop方法时,开始将InstanceTest2类载入内存,装载完成后开始自动运行静态变量的声明代码和静态块
也就是说静态变量是在载入内存后初始化的;
再一示例:
package com.skymr.learn;
public class InstanceTest3 {
public static void main(String[] args){
Person son = new Person(5);
System.out.println(son.parent.value);
System.out.println(son.value);
}
}
class Person{
final static Person parent = new Person(2); //1
static int age = 30; //2
int value;
public Person(int delta){
value = age + delta;
}
}
打印 出:
2
35
分析:new Person时最先执行 1,此时age=0, 所以son.parent.value = 0 + 2 = 2;
执行完2后,才会进行son的构造方法,所以age = 30;value也就为35了.
手机扫一扫
移动阅读更方便
你可能感兴趣的文章