静态代码块
格式:static{静态代码块执行语句};
关于静态代码块,要注意的是:
1.它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的,当然,建立对象的时候,它也会执行,但是建立多个对象,它也是只会执行一次,并不是说每次建立对象它都要执行,因为它是由类调用的,且只执行一次!就它优先于主函数而执行这点来说,因为主函数也是由类调用的,所以类可以控制着执行的顺序,而实际上,类调用时,先执行静态代码块,然后才执行主函数的。
2.静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的。区分着理解比较容易记牢。
下面结合一个小例子来具体分析三者的用法。
classStaticCode{
int num=9;
StaticCode(){
System.out.println("b");
}
static{
System.out.println("a");
}
{
System.out.println("c");
}
StaticCode(int x){
System.out.println("d");
}
}
public classStaticCodeDemo {
public static voidmain(String[] args){
newStaticCode(1);
}
}
运行结果是
a
c
d
这是因为,主函数中的执行语句是new StaticCode(1);因为这个语句调用了StaticCode类并调用StaticCode的一个构造函数建立对象,那么在StaticCode类中,先执行的是静态代码块
static{
System.out.println("a");
}
它是在调用类时立即执行,但此时还没有建立对象。然后执行的是构造代码块,
{
System.out.println("c");
}
这是在建立对象时执行,但它的执行是优先于构造函数的。接着执行的是对应的构造函数
StaticCode(int x){
System.out.println("d");
}
,这个构造函数与new StaticCode(1);有着相同的参数个数和对应的参数类型,执行语句自动匹配寻找对应的构造函数。
另外,StaticCode类中有个成员变量num,如果将静态代码块改为
static{
System.out.println("a"+this.num);
}
则编译不通过,因为静态代码块只能调用静态变量,非静态成员变量在对象没有建立前是不存在的,这也帮助理解了静态代码块是在对象建立前执行的。
如果将构造代码块改为
{
System.out.println("c,num="+this.num);
}
那么将编译无误,运行正确,因为构造代码块是在对象建立后才运行的,是由对象调用的,对象建立后,成员变量num已经存在了,所以不会出错。
运行结果如下
a
c,num=9
d
|