本帖最后由 吴愿涛 于 2012-11-2 15:07 编辑
以前记得static代码块貌似是Java类加载过程中优先级最高的,但是最近几天写代码发现不是这样的,因为static变量的优先级要比static代码块高得多,所以因此我犯了不少错误,下面以一个例子来说明一下一个类初始化为对象的时候的加载过程:- package day0508;
- public class Test4 {
- /**
- * @param args
- */
- private static A a = new A();
- private final F f = new F();
- private B b = new B();
- static{
- System.out.println("c");
- }
- public Test4(){
- System.out.println("Test");
- }
- public static void main(String[] args) {
- Test t = new Test();
- try {
- Class.forName("day0508.Test4");
- } catch (ClassNotFoundException e) {
- // TODO: handle exception
- e.printStackTrace();
- }
- }
- class A{
- public A(){
- System.out.println("A");
- }
- }
- class B{
- public B(){
- System.out.println("B");
- }
- }
- class F{
- public F(){
- System.out.println("F");
- }
- }
- }
复制代码 直接运行Test t = new test();这句话,运行结果为
A F c B Test 所以是先static变量,然后是static的代码块,然后才是普通变量,最后是构造函数
如果是运行Class.forName()函数的话,运行结果为
A F c 还是这样,先是static变量,然后才是static代码块,所以那种对于class.Forname加载类,只调用static代码块的误区要克服,因为还有一个static代码块在等着你,呵呵,我得记录下来以示警戒。 |