public class demo{
static String str = "aaaa";
static{
System.out.println(str);
System.out.println("bbb");
}
demo(){
str = "cccc";
System.out.println(str);
}
public static void main(String a[]){
System.out.println(str);
demo mydemo = new demo();
}
}
输出什么结果,高手可以来解释一下静态初始化器是怎么工作的?是不是先与构造函数执行????

解决方案 »

  1.   

    static语句块在类装载的时候执行 当然先于构造函数 
      

  2.   

    static语句块只执行一次,当该类第一次被初始化时调用,且只运行一次,在构造函数之前
      

  3.   

    输出aaaa
    bbb
    aaaa
    cccc
    静态初始化器是针对类的构造函数是针对对象的当然是现有类,再有对象所以静态初始化器先于构造函数。
      

  4.   

    这样给你解释吧:
    static 与实例无关,哪怕你创建实例后,你在销毁实例后,static里面的东西依然存在,直到线程over
    JAVA在执行程序的时候首先装载类,然后找mian()
    所以,在装载类的时候,遇到static马上执行,
    因此,public class demo{
        static String str = "aaaa";
        static{
            System.out.println(str);
            System.out.println("bbb");
        }
        demo(){
            str = "cccc";
            System.out.println(str);
        }
        public static void main(String a[]){
            System.out.println(str);
            demo mydemo = new demo();
        }
    }首先执行static String str="aaaa";
    接着执行static{
            System.out.println(str);
            System.out.println("bbb");
        }
    然后装载完毕,进入main()
    执行System.out.println(str);
    接着执行demo mydemo = new demo();
    打印结果为:
    aaaa
    bbb
    aaaa
    cccc
    如果不明白,你可以去看看我发的那个“测试下你是否真的理解JAVA运行机制和执行顺序 ”
      

  5.   

    public class demo{
        static String str = "aaaa";
        static{
            System.out.println(str);//即使没有任何对象,静态初始化器都要执行,所以前两行输出是aaaa,bbb
            System.out.println("bbb");
        }
        demo(){
            str = "cccc";
            System.out.println(str);
        }
        public static void main(String a[]){
            System.out.println(str);//这里的输出要看构造函数的执行情况,这种情况本句输出的是aaaa,如果构造函数先执行,
                                         //则修改了str变量,System.out.println(str)将输出cccc,下面的那种情况!
            demo mydemo = new demo();
        
                                 //但是要注意一点,无论demo mydemo = new demo()与System.out.println(str)位置如何,都是System.out.println(str)先执行,也就是先输出的意思,可以试一下    
    //具体原因还在研究中,不知道为啥是这样!!!
    public class demo{
        static String str = "aaaa";
        static{
            System.out.println(str);
            System.out.println("bbb");
        }
        demo(){
            str = "cccc";
            System.out.println(str);
        }
        public static void main(String a[]){
            
            demo mydemo = new demo();
            System.out.println(str);//这种情况本句输出的是cccc,因为构造函数修改了静态变量str
        }
    }
      

  6.   

    public class Demo{
        static String str = "aaaa";
        static{
            System.out.println(str);
            System.out.println("bbb");
        }
        Demo(){
            str = "cccc";
            System.out.println("构造函数执行~~~~~"+str);
        }
        public static void main(String a[]){
           System.out.println("构造函数执行之前:str="+str);
            Demo mydemo = new Demo();
            System.out.println("构造函数执行之后:str="+str);
        }
    }
    这个可以看的很清楚!!!!