static的静态变量先, 静态代码块的加载后, 楼主看thinking in java 有详细 介绍!
类的加载过程包括静态变量和静态代码块的加载,至于是静态变量先加载还是静态代码块先加载,则依赖于谁先定义,如下: class A{ public A(){ System.out.println("A constructor"); } } class B{ public B(){ System.out.println("B constructor"); } }public class Test { private static A a = new A(); static{ System.out.println("static initialize"); } private static B b = new B();
public static void main(String [] args) { System.out.println("main()"); } }
静态代码块的加载后,
楼主看thinking in java 有详细 介绍!
类的加载过程包括静态变量和静态代码块的加载,至于是静态变量先加载还是静态代码块先加载,则依赖于谁先定义,如下:
class A{
public A(){
System.out.println("A constructor");
}
}
class B{
public B(){
System.out.println("B constructor");
}
}public class Test {
private static A a = new A();
static{
System.out.println("static initialize");
}
private static B b = new B();
public static void main(String [] args) {
System.out.println("main()");
}
}
当一个类加载的时候,会按照定义的顺序来初始化静态成员和执行静态代码段
class A{
public A(){
System.out.println("A constructor");
}
}
class B{
public B(){
System.out.println("B constructor");
}
}public class Test {
static{
System.out.println("static initialize");
}
private static A a = new A();
private static B b = new B();
public static void main(String [] args) {
System.out.println("main()");
}
}
这样是 先输出的“static initalize"啊!到底是怎么回事
static{
System.out.println("static initialize");
}
private static A a = new A();
private static B b = new B();
你的静态代码段在静态成员A类之上,当然是先输出了
可以看到详细的加载流程,static属于Class对象,所以是在Class对象被ClassLoader加载的时候初始化
加载的4个原则
1 ,先搞基类,在搞子类
2 先static 字段后非static 字段,
3 先static 方法,后非static 方法,
4 构造方法
2 父类代码块--->>子类代码块
3 父类构造方法--->>子类构造方法
这样肯定是不行的对象的创建肯定是在静态代码块后的。楼主可以在静态代码块中输出静态变量的值看是赋值过后的值还是0
类是加载的,而静态量是初始化的。顺序也就好理解了。生成一个类大体按照如下顺序
1,加载
定位类(文件系统,JAR,URL)
把文件读入heap
解析类
创建一个Class对象
2,链接
验证类结构
分配空间
resolution 比如将一个引用指向实际的对象
3,初始化
初始化变量,静态块
public class Test {
private static String temp = "123";
static{
temp = "456";
} /**
* @param args
*/
public static void main(String[] args) { Test test = new Test();
System.out.println(test.temp); }}
最终输出的结果应该是456,这样说明静态模块在变量后面进行,对初始变量的值进行了覆盖。
静态代码块-->基类构造-->在本类构造。
类加载时机:
1:实例化对象时
2:类名.[static]属性/方法()时
3:被其他类has a关系时,其他类加载时,该类也会被加载。
好像还有一种,想不起来了。
public class Test { static{
temp = "456";
}
private static String temp = "123"; /**
* @param args
*/
public static void main(String[] args) { Test test = new Test();
System.out.println(test.temp); } }
输出的结果是:123
所以不一定就先执行啊
还有那哥们说用debug。。这个初始化是在加载的时候。。
怎么用啊??