Java static{} 语句详解

来源:互联网 发布:抓阄软件 编辑:程序博客网 时间:2024/06/07 03:27

一、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);    }}结果:12345

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);}}结果:200300300

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