Java static{} 语句详解

一、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)访问静态常量,如果编译器可以计算出常量的值,则不会加载类。
参考链接:
http://blog.csdn.net/newjerryj/article/details/8650268

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值