请教几个问题 看这句话:
静态初始化只在Class对象首次进行加载的时候进行一次
问:
1,首次加载是什么意思 难道同一个类还要加载很多次吗 
2,加载的是Class对象吗
3,初始化是在类加载的时候进行的吗 
4,每加载类一次进行一次初始化吗 
5,初始化是在创建对象或者调用静态方法是进行的吗
谢谢

解决方案 »

  1.   

    可以多次加载的,比如调试时,还有用了自定义的class loader 时,(比如jsp页面),但是 static 的值不会变。
    所以说 首次加载 吧,我也不确定。
    可以这样试验,在jsp中定义一个 static 的变量,读出来看看,然后改一下,(导致重新加载),然后再看看。首次引用到class对象时加载,如果引用的是实例,那么必然先加载new这个实例,此时class对象就被加载了。初始化动作是在加载的时候执行的,加载也分几个步骤的。其中包括初始化。static 部分只初始化一次,non-static 部分是new的时候做的。初始化 在创建对象或者调用静态方法之前进行的,你能用的时候jvm保证这个已经可以用了,肯定是完成了初始化的。
      

  2.   

    给你介绍下类的加载机制,你就明白了,最好用代码测试下
    java 的类加载机制分三步,加载  ---连接 ---初始化
           加载: 将.class文件中的二进制数据读入到内存中,把它存放在运行时数据区的反方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
           jvm加载类二进制数据有这几种途径:
              a: 把一个java源文件动态编译成class文件。
              b: 从一个本地文件系统中加载class文件。
              c: 通过网络下载类的.class文件。比如:applat.
              d: 从Zip,jar或其它类型的归档文件中提取.class文件。
              e: 从一个专有的数据库中提取.class文件。
           连接:包括三个过程: 验证,准备,和解析。其中验证主要是检查与语法上的错误。准备将静态变量赋上其类型默认值。
       解析:将符号引用转变为直接引用。
           初始化:将静态变量赋上初始值,执行静态代码快,其顺序是从上到下的顺序执行。
          类加载器在加载不了类的时候,并不一定报错,而是类在第一次主动使用的时候,才会去报加载错误信息。
         类首次主动使用,大概有这些情况:
           1:调用了类的静态方法或变量。
           2:用反射的方式创建对象。
    写了个例子,你看下就明白了:
    public class TestClass {

        /*
         * static block
         */
    static{
    System.out.println("static block!");
    }

    /*
     * non static block
     */
    {
    System.out.println("non static block!");
    }


    TestClass(){
    System.out.println("common constructor!");
    }

    public static void main(String[] args){
    TestClass class1 = new TestClass();   //first load
    TestClass class2 = new TestClass();   //second load
    }
    }
      

  3.   

    1 可以家载多次
    2、是class对象
    3、是
    4、是
    5、静态初始化是家载类时进行,