Java 静态初始化顺序
来源:互联网 发布:在淘宝网上买手机可靠吗 编辑:程序博客网 时间:2024/04/20 02:29
原帖:http://topic.csdn.net/u/20081031/20/6a66d680-fd4e-4ffd-808e-34cea79eb7d6.html
package NewPractice;
public class Test1 {
public static int k = 0;
public static Test1 t1 = new Test1("t1");
public static Test1 t2 = new Test1("t2");
public static int i = print("i");
public static int n = 99;
public int j;
static {
print("aa static");
}
public Test1(String str) {
j = print("j");
print("aa constructor");
System.out.println((++k) + ": " + str + " i=" + i + " n=" + n);
++i;
++n;
}
public static int print(String str1) {
System.out.println((++k) + ": " + str1 + " i=" + i + " n=" + n);
++n;
return ++i;
}
public static void main(String[] strings) {
}
}
输出:
1: j i=0 n=0
2: aa constructor i=1 n=1
3: t1 i=2 n=2
4: j i=3 n=3
5: aa constructor i=4 n=4
6: t2 i=5 n=5
7: i i=6 n=6
8: aa static i=7 n=99
问题:i和n到底是什么时候声明的,public static Test1 t1=new Test1("t1");这句会去执行构造块和构造方法,但是这时候public static int i=print("i");并没执行,i是哪里出来的?它是按顺序先声明所有变量然后才从头再挨个赋值吗?
原因是:类的生命周期分为如下几个阶段,Loading,Linking,Initialization.
Loading之后会对class文件进行Verification(验证).
然后是Preparation阶段,注意在这个阶段所有的类变量 (class变量),会被默认初始化,int,long,short,浮点等基本类型初始化为0,引用初始化为null,boolean被初始化为 false.也就是到这个阶段各个static变量已经有默认的值了;
后面会进入Resolution阶段,然后才是初始化( Initialization),
这个阶段会执行static初始化,把变量初始化为你指定的值.也就是在这个阶段k=0;Test1 t1=new Test1("t1");
才开始执行的,这时候i=print("i");还没有执行到,i仍然取在 Preparation阶段得到的默认值0.
参考: 深入java虚拟机
http://www.artima.com/insidejvm/ed2/lifetype.html
- Java 静态初始化顺序
- 【java】静态&初始化执行顺序
- java 静态变量初始化顺序
- java 静态初始化执行顺序
- Java静态方法,静态变量,初始化顺序
- Java静态方法,静态变量,初始化顺序
- Java静态方法,静态变量,初始化顺序
- Java静态方法,静态变量,初始化顺序
- Java静态方法,静态变量,初始化顺序
- java静态方法,静态变量,初始化顺序
- Java静态方法,静态变量,初始化顺序
- java初始化块(静态)顺序
- 静态成员的初始化顺序(C#,java)
- Java 静态变量的初始化顺序
- java类 静态实例初始化顺序
- JAVA静态初始化块,初始化块,构造器调用顺序
- Java静态方法,静态变量,初始化顺序 static
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造方法)
- CFileDialog打开多个文件失败 返回错误 FNERR_BUFFERTOOSMALL
- c#常用函数列表
- 在Winchill 8.0 中加入鏈接的用戶驗證
- ASP.NET 伪静态页面生成
- 王者归来
- Java 静态初始化顺序
- 在weblogic中配置和使用dataSource
- 认识hasLayout——IE浏览器css bug的一大罪恶根源(转载网址http://neverned.blog.163.com/blog/static/1265524200933021130561/)
- DWR使用介绍
- odbc与oledb的区别
- 图片服务器分流的问题[转]
- vc 网络上下载文件
- 完成一年前的想法,写个聊天用的小东西
- rindex函数原型