代码块
代码块
代码块可以看成一个只有方法体的方法,都是优先于类的构造器而执行。代码块有静态代码块和非静态代码块。样式如下
//下面就是一段非静态代码块(普通代码块)
{
//方法体
};//分号可加可不加
static{//这是静态代码块
//方法体
};//分号可加可不加
作用
代码块可以看成一种另类的构造器,当我们使用的多个构造器有很多重复语句,比如都打印一句话,就可以放在代码块中,这是一种对构造器的补充机制,大大减少了构造器的冗余代码,看起来更加的简洁。
代码块注意事项
一 加了static的代码块叫静态代码块,没有static修饰就是非静态代码块。静态代码块随着类的加载而加载,并且只会执行一次。普通代码块随着每个对象的实例化而执行。
二 类何时加载
1. 调用静态成员的时候
2. 创建实例化对象
3. 创建子类对象,父类也会加载
三 创建对象的时候,就含有普通代码块的隐式调用,每创建一个对象,便会执行一次普通代码块,如果仅使用类的静态成员就不会执行。
四 创建一个对象时,一个类的调用顺序
1. [静态部分]静态代码块和静态属性初始化,这两者优先级一样,谁写在前面就先调用谁
class A{
private int a = 0;//静态属性(变量)初始化
static { }; //静态代码块
}
上面这个A类就会先执行a = 0,然后再执行静态代码块里的内容
- [非静态部分]非静态代码块和非静态属性初始化,和上面一样,谁在前面谁就先执行,但是执行的优先级是低于[静态部分]的
class A{
//非静态部分
{/*非静态代码块*/}; //1
String name; //非静态属性初始化 //2
//静态部分
private int a = 0;//静态属性(变量)初始化 //3
static {/*静态代码块*/}; //4
}
执行顺序就是3 --> 4 --> 1 --> 2
3. [构造器(构造方法)]最后执行,调用构造方法
五 构造器中已经隐含了super()和普通代码块的执行
class X {//父类
//....
}
class A extends X{//子类
public A (){
//super ();
//普通代码块
//构造方法
}
}
静态相关的代码块和属性初始化,在类的加载中完毕就执行了,因此就优先于普通代码块和构造器。
六 例子使用上面的代码,父类X子类A,当创建子类A的对象时,整个的执行顺序是什么。
1. 父类的静态部分 (静态代码块和静态属性初始化)
2. 父类的非静态部分 (非静态代码块和非静态属性初始化)
3. 父类构造器
4. 子类静态部分 (静态代码块和静态属性初始化)
5. 子类非静态部分 (非静态代码块和非静态属性初始化)
6. 子类构造器
如果是第二次创建A的对象,那么上述步骤的1和4也就是静态部分就不会重复执行,遵守静态代码块只执行一次。
在向上转型的时候,如X x = new A();对象x在运行的时候是子类A对象,因此在程序中还是会如上述步骤一样123456这样跑下来
七 静态代码块只能调用静态成员,非静态代码块可以调用所有成员
成员:就是类的属性(变量)、方法的一个统称