package com.myclass.src;public class StaticDemo {
static int a = 3;
static int b;
//b = 6;
static void meth(int x) {
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
} static {
System.out.println("Static 块开始");
b = a * 4;
} public static void main(String args[]) {
System.out.println("main 开始");
meth(42);
}
}

解决方案 »

  1.   

    Static 块开始
    main 开始
    x = 42
    a = 3
    b = 12
    虚拟机运行是先进行类加载,所以静态代码块在类加载是就运行一次,而且就运行一次
    然后才是主方法运行
      

  2.   

    静态初始化的顺序
     先初始化静态成员变量和静态初始化块,在main中,在调用静态方法meth()之前,b已经由静态初始化块得到初始化。
      静态初始化顺序一般是(静态变量,静态初始化块)先于(成员变量,初始化块)先于(构造函数)
      

  3.   


    package com.luowei.test2.test;public class OrderTest {
    public static void main(String[] args) {
    new Child2();//静态块在这执行了
    System.out.println("-----------------------");
    new Child2();//静态块已经在上面执行了,所以在这就不执行了
    }}class Parent {
    static {
    System.out.println("parent static block");
    } public Parent() {
    System.out.println("parent constructor");
    }
    }class Child extends Parent{
    static{
    System.out.println("child static block");
    }
    public Child(){
    System.out.println("child constructor");
    }
    }class Child2 extends Child{
    static{
    System.out.println("chile2 static block");
    }
    public Child2(){
    System.out.println("child2 constructor");
    }
    }