是程序运行时就已经有了吗,不论是否会创建这个类的对象?如果
class Test{
     public static int test=1;
}是不是程序一运行,内存中就已经有一个为一的test了呢
还是当第一次创建对象时,才会有

解决方案 »

  1.   

    Test t = null;
    的时候就会有了
      

  2.   

    出一个例子:
    class Insect {
    //1) int i = 9;
     int j;
    //2)  Insect() {
              prt("i = " + i + ", j = " + j); //类Insect的构造函数Insect()就用到了i ,j;这里i输出来的结果应该是9 ;
              j = 39;
             }
    //3) static int x1 = prt("static Insect.x1 initialized");
     static int prt(String s) {
      System.out.println(s);
      return 47;
     }
    }
    //Beetle是Insect的子类public class Beetle extends Insect {
    //4) int k = prt("Beetle.k initialized");
    //5) Beetle() {
      prt("k = " + k);
      prt("j = " + j);
     }
    //6) static int x2 = prt("static Beetle.x2 initialized");
     static int prt(String s) {
      System.out.println(s);
      return 63;
     }
     public static void main(String[] args) {
      prt("Beetle constructor");
      Beetle b = new Beetle();
     }
    }上面这个例子还包括了一个子类一个父类,相对初始化装载的时候稍微有点麻烦一点,但是总体原则是一样的。根据我的编号,装载的顺序是:3、6、1、2、4、5。当在装载Beetle类的时候,先去找Beetle.class把他装载进来,在Beetle.class装载到一半的时候,发现他还有个父类Insect.class,那么需要把Insect.class也装载进来,并且先对他进行初始化,那么(3)是最先被初始化的,接下来父类装载完毕之后,子类接着也装载进来,这样,(6)接着被初始化。new Beetle()的时候,先分配内存,接着父类的非静态初始化,然后父类构造函数,所以(1)(2)陆续初始化,接着是子类(4)(5)。基本上初始化的顺序是先父类后子类,先静态,后非静态,最后才是构造函数。
      

  3.   

    在你把test装载的时候就分配好了test变量的内存
      

  4.   

    创建一个对象,或者是类.class的时候就会加载静态的数据。
      

  5.   

    只要涉及到这个类就会运行里面的static的代码或者对象了。
      

  6.   

    静态域的初始化发生在其所在类或接口被初始化的时候类和接口T会在以下情况下被初始化:
    •   T是一个类,并且它的一个实例被创建 
    •   T是一个类,并且它的一个静态方法被执行  
    •   T的一个非常量静态域被使用或赋值(就是非static final修饰的域) 
    •   没有用反射包中的方法执行和T有关的操作(比如Class.forName())