一、static{}(即static块)、会在类被加载的时候执行且仅会执行一次,一般用来初始化静态变量和静态方法。
因为JVM虚拟机的生命周期中一个类只被加载一次;又因为static{}是伴随类加载执行的,所以不管你new多少次对象实例,static{}都只执行一次。
二、准确理解类加载的准确含义:
1、实例化一个类时,Test t = new Test();和Test t =(Test)Class.forName().newinstance();等价
2、调用类的静态方法的时候,需将main()函数的内容改为:类名.方法名。
3、调用类的静态变量的时候,需将main()函数的内容改为:System.out.println(类名.变量)
注意:1、在调用类的静态常量的时候,是不会加载类的,即不会执行static{}语句块。(JVM的规定,当访问类的静态常量时,如果编译器可以计算常量的值,则不会加载类,否则会加载类)
2、用Class.forName()形式的时候,我们也可以自己设定要不要加载类,如将Class.forName(“Test”)改为Class.forName(“Test”,false,StaticBlockTest.class.getClassLoader()),则Test没有被加载,static{}没有被执行。
三、static{}语句块的执行次序:
1、当一个类中有多个static{}的时候,按照static{}的定义顺序,从前往后执行;
2、先执行完static{}语句块的内容,才会执行调用语句;

public class Test{
    static{
        System.out.println(1);
    }
    static {
        System.out.println(2);
    }
    static {
        System.out.println(3);
    }
    public static void main(String args[]){
        System.out.println(5);
    }
    static {
        System.out.println(4);
    }
}
结果:
1
2
3
4
5

3、如果静态变量在定义的时候就赋给了初值(如static int X=100),那么赋值操作也是在类的加载的时候完成的,并且当一个类中既有static{}又有static变量的时候,同样遵循“先定义先执行”的原则;

package test.java;

class Test2{
public static int X=200;
static{
 System.out.println(X);
 X=300;
 System.out.println(X);
}
}

public class Test{
public static void main(String args[]){
 System.out.println(Test2.X);
}
}
结果:
200
300
300

总结:类加载特性:
**1、在虚拟机的生命周期中一个类只被加载一次。
2、类加载的原则:延迟加载,能少加载就少加载,因为虚拟机的空间是有限的。**
类加载的时机:
1)第一次创建对象要加载类.
2)调用静态方法时要加载类,访问静态属性时会加载类。
3)加载子类时必定会先加载父类。
4)创建对象引用不加载类.
5) 子类调用父类的静态方法时
(1)当子类没有覆盖父类的静态方法时,只加载父类,不加载子类
(2)当子类有覆盖父类的静态方法时,既加载父类,又加载子类
6)访问静态常量,如果编译器可以计算出常量的值,则不会加载类。