一个类在被JAVA虚拟机加载时它的静态变量和静态方法哪个先被初始化啊

解决方案 »

  1.   

    方法不调用是不加载的。
    有方法调用的时候,先静态变量(静态处理块)后静态方法
    最简单的例子public class Test {
        static String s = "test";
        static {
            System.out.println("before main: s=" + s);
        }
        
        public static void main(String[] args) {
            System.out.println("in main: s=" + s);
            s = "changed";
            System.out.println("after change: s=" + s);
        }
    }
      

  2.   

    static {
            ...
        }
    这样的静态块是一旦加载类即执行的
    静态变量是由一个静态方法的返回值来初始化,那你这个静态变量也有初始值null的。
      

  3.   

    那如果静态变量是由一个静态方法的返回值来初始化的,那静态变量和静态方法哪个先被初始化啊?
    ---------------------
    当然还是先初始化变量了,只不过是初始化为null而已,调用完静态方法后,再把返回值赋给变量。
      

  4.   

    那能不能帮我排列个顺序啊,大哥们,静态变量,静态方法,静态块,从类被JAVA虚拟机加载后开始,他们初始化的顺序啊我们老师给我们这样一个例子public class Parent {

    private static int iz = getNext(2);
    private static int iy=99;


    //静态初始化块
    static
    {
    System.out.println("parent的静态初始化块");
    System.out.println(iz);
    System.out.println(iy);
    }



    public static int getNext(int base)
    {
    System.out.println("parent的static int getNext(int base)被调用");
                    System.out.println(iy);
    System.out.println(iz);
    return ++base;
    }

    public static void t()
    {
    System.out.println("parent的static void t被调用");
    System.out.println(iz);

    }}
      

  5.   


    public   class   Parent   { 
    //第零步,首先定义iz,iy两个变量,并初始化为0(因为是int类型,如果是对象则为null)
    private   static   int   iz   =   getNext(2); //第一步,因为有方法调用,所以转到方法,即第二步
    private   static   int   iy=99; //第三步
    //静态初始化块 
    static //第四步

    System.out.println("parent的静态初始化块"); 
    System.out.println(iz); //这里因为第二步,iz=3
    System.out.println(iy); //这里因为第三步,iy=4
    } public   static   int   getNext(int   base) //第二步,方法调用

    System.out.println("parent的static   int   getNext(int   base)被调用"); 
                                    System.out.println(iy); //iy初始化为0
    System.out.println(iz); //iz初始化也为0,这里就说明先走变量定义,对于int类型,初始化为0
    return   ++base; 
    } public   static   void   t() //这里没有执行,这就说明了,方法不调用,就不会被加载,所以如果第一步不调用getNext方法,第二步就不会执行,就会直接到第三步

    System.out.println("parent的static   void   t被调用"); 
    System.out.println(iz); } }
      

  6.   

    纠正一下,上面因为顺手写的,所以//这里因为第三步,iy=4,这里应该是iy=99