静态代码块执行顺序
1 /* 2 栈:方法只要执行,会压栈。(局部变量) 3 堆:new出来的对象都在堆中。垃圾回收器主要针对。(实例变量) 4 方法区:类的信息,字节码信息,代码片段。(静态变量) 5 6 方法的代码片段放在方法区,但是方法执行过程当中需要的内存在栈中。 7 */ 8 public class StaticTest07{ 9 10 // 静态变量在什么时候初始化?类加载时初始化。 11 // 静态变量存储在哪里?方法区 12 static int i = 100; 13 14 // 静态代码块什么时候执行?类加载时执行。 15 static { 16 // 这里可以访问i吗? 17 System.out.println("i = " + i); 18 } 19 20 // 实例变量 21 int k = 111; // k变量是实例变量,在构造方法执行时内存空间才会开辟。 22 23 static { 24 //k变量可以访问吗? 25 // static静态代码块在类加载时执行,并且只执行一次。 26 // 类加载时,k变量空间还没有开辟出来呢。 27 //错误: 无法从静态上下文中引用非静态 变量 k 28 //System.out.println("k = " + k); 29 30 // 这里可以访问name吗? 31 //错误: 非法前向引用 32 // 静态代码块和静态变量都在类加载的时候执行,时间相同,只能靠代码的顺序来决定谁先谁后。 33 //System.out.println("name = " + name); 34 } 35 36 // 静态变量在静态代码块下面。 37 static String name = "zhangsan"; 38 39 40 //入口(main方法执行之前实际上执行了很多代码) 41 public static void main(String[] args){ 42 System.out.println("main begin"); 43 System.out.println("main over"); 44 } 45 } 46 47 /* 48 总结: 49 到目前为止,你遇到的所有java程序,有顺序要求的是哪些? 50 第一:对于一个方法来说,方法体中的代码是有顺序的,遵循自上而下的顺序执行。 51 第二:静态代码块1和静态代码块2是有先后顺序的。 52 第三:静态代码块和静态变量是有先后顺序的。 53 */