有谁知道static的静态变量和静态代码块的加载问题?
哪么类又是在什么时候加载的?

解决方案 »

  1.   

    static的静态变量先,
    静态代码块的加载后,
    楼主看thinking in java 有详细 介绍!
      

  2.   


    类的加载过程包括静态变量和静态代码块的加载,至于是静态变量先加载还是静态代码块先加载,则依赖于谁先定义,如下:
    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()");
        }
    }
      

  3.   

    同一个类的jingtaii成员和静态代码段是根据定义的顺序来执行的
    当一个类加载的时候,会按照定义的顺序来初始化静态成员和执行静态代码段
      

  4.   


    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"啊!到底是怎么回事
      

  5.   

    楼主预解详情,请看这里:http://hi.baidu.com/yds_amber/blog/item/53936ec8b5f6e4117f3e6fb4.html
      

  6.   

    回复8楼的:
    static{
            System.out.println("static initialize");
        }
        private static A a = new A();
        private static B b = new B(); 
    你的静态代码段在静态成员A类之上,当然是先输出了
      

  7.   

    你执行用java -verbose yourJava.class
    可以看到详细的加载流程,static属于Class对象,所以是在Class对象被ClassLoader加载的时候初始化
      

  8.   

    不信你可以用Class.forName("yourJavaClassName");看看static块是否执行
      

  9.   


    加载的4个原则
      1 ,先搞基类,在搞子类
      2 先static 字段后非static 字段,
      3 先static 方法,后非static 方法,
      4 构造方法
      

  10.   

    1 父类static代码块--->>子类static代码块
    2 父类代码块--->>子类代码块
    3 父类构造方法--->>子类构造方法
      

  11.   

    >>private static B b = new B();>>
    这样肯定是不行的对象的创建肯定是在静态代码块后的。楼主可以在静态代码块中输出静态变量的值看是赋值过后的值还是0
      

  12.   

    这里你可以玩一个文字游戏。
    类是加载的,而静态量是初始化的。顺序也就好理解了。生成一个类大体按照如下顺序
    1,加载
      定位类(文件系统,JAR,URL)
      把文件读入heap
      解析类
      创建一个Class对象
    2,链接
      验证类结构
      分配空间
      resolution 比如将一个引用指向实际的对象
    3,初始化
      初始化变量,静态块
      

  13.   

    是什么时候加载,要想看到其实很简单,打开elcipse,把这些东东写进去,写个main方法一调试,顺序全出来了
      

  14.   

    俺不知道,可是给你一介绍一个工具,myeclipse 6.0呀,用debug进行,next step操作,即可看到结果啦,甚至每一个参数赋值的先后顺序都能看到!
      

  15.   

    变量先初始化,然后才是静态模块,可以通过下面的例子表现:
    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,这样说明静态模块在变量后面进行,对初始变量的值进行了覆盖。
      

  16.   

    类中加载时:
        静态代码块-->基类构造-->在本类构造。
    类加载时机:
        1:实例化对象时
        2:类名.[static]属性/方法()时
        3:被其他类has a关系时,其他类加载时,该类也会被加载。
    好像还有一种,想不起来了。
      

  17.   

    如果把上面的代码改了,就变了:
    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。。这个初始化是在加载的时候。。
    怎么用啊??