public class StaticStuff {
static int x = 15;
static{
x *=3;
}
public static void main(String[] args){
System.out.println("x= "+x);
}
static{
x /=3;
}
}
问题1:static {  }为什么这里不需要函数名,以及返回类型。
问题2:运行结果问什么是x=15,不是先运行x*=3,x变成45,再运行System.out.println("x="+x);输出应该是45,呀,最后运行x /=3的吗?

解决方案 »

  1.   

    静态代码块在类加载时执行,也就是,静态代码完了才是main方法执行。
      

  2.   

    问题1:static是静态代码块,在类加载的时候就执行,它不是的一个方法。
    问题2:在整个类加载完成之后,就初始化静态(静态变量,静态块)。只执行一次,然后类加载器ClassLoader就把类Class返还,执行main方法。以后new这个对象都不会再执行这个代码块
      

  3.   

    这里涉及到类加载顺序问题  一个CLASS文件是先加载-->静态属性初始化-->静态代码块-->初始化普通属性-->普通代码块-->构造方法
      

  4.   

    其实main方法是程序的入口,所有程序都是从这里开始执行。所有静态变量、静态代码在程序执行前就会提前加载入内存的静态存储区。所有静态变量和方法都会初始化(相当于运行)一遍。也就是说从x=15,x*=3,x/=3这些都会执行,然后才会执行main方法。
    用一个简单点的例子来说名就是,在这个main方法下面定义一个static的变量y难道main方法就访问不到了么。这个执行顺序主要是针对同级内的来说,而静态变量和静态方法与main函数的调用不是在同一级别上,因此说谁先谁后这么比较是错误的。
      

  5.   

    问题1 静态代码块不是方法,问题2 其实就是优先执行static 代码块,第一个static代码块让15*3=45,第二个static让45/3=15,最后执行了main函数来打印输出
      

  6.   

    [b][b]static{   }代表的是静态代码块,和静态函数是不一样的,静态代码块是加载类的时候,就自动执行静态代码块里的逻辑,静态方法是被调用才执行。还有就是你的 X *= 3 和X /= 3 都是放在静态代码块里,所以,在类加载的时候,自动执行这两个逻辑的,然后再到main方法里[/b][/b]
      

  7.   

    在初始化类的时候,JVM会对static修饰的变量和代码块进行初始化,在共享区域的数据去分配存储空间,当有多个static时,按照顺序执行,然后再执行main方法。所以结果是15
    还有static{   },这个是静态的代码块的语法抒写规范,不是方法哦
      

  8.   

    问题一:因为static{}是一个静态代码块,随着类的加载而加载,它不是方法所以没有函数名和返回类型问题二:因为程序是由jvm调用main方法运行的 所以先执行main方法里面的输出x,找x的时候静态代码块的是局部变量,而static int x =15;是一个静态成员变量,而main方法里面没有x,所以他会去调用成员变量输出
      

  9.   

    类加载顺序http://blog.csdn.net/hmzdbql/article/details/8097172
      

  10.   

    静态代码块的初始化优先与main方法。最好多看书