常见代码块及特性
静态代码块:
static{ } 类中方法外
随着类的加载而加载,并且只加载一次,多个之间按代码顺序执行,适用于类存在就使用的代码。
构造代码块:
{ } 类中方法外
随着构造方法的执行而执行,每一次执行构造方法都会执行代码块,并且在构造方法的代码之前执行。适用于多个构造方法中 有共性代码时,可提取到代码块中执行。
局部代码块:
{ } 方法中
主要是用来限定变量的作用域。
类的成员
属性,方法,构造方法,代码块。
执行步骤
public class 对象的加载顺序 {
public static void main(String[] args) {
new F().fun();
}
}
class F{
static{
System.out.println("这是F类的静态代码块。。。。5");
}
{
System.out.println("这是F类的构造代码块。。。。6");
}
int a = setA();
private int setA() {
System.out.println("这是F类的显式初始化。。。4");
return 0;
}
public void fun(){
System.out.println("这是F类的非静态方法。。。1");
}
public F(){
System.out.println("这是F类的无参构造方法。。。。2");
}
public F(int a){
System.out.println("这是F类的有参构造方法。。。。3");
}
}
这是F类的静态代码块。。。。5
这是F类的构造代码块。。。。6
这是f类的显式初始化。。。4
这是F类的无参构造方法。。。。2
这是F类的非静态方法。。。1
Process finished with exit code 0
①判断对象的加载顺序,该类是否存在在方法区中,若存在,直接使用,若不存在,向硬盘上进行加载到方法区;
②查找main方法压栈执行;
③判断F类是否存在于方法区,若存在,直接使用,若不存在,向硬盘上进行加载到方法区;
④由于new关键字,在堆中开辟F类的对象空间,并且对属性a 进行默认初始化;
⑤根据构造方法,选择构造方法进行执行;
⑥在执行构造方法之前,该位置需要执行隐式三步:
1>super(参数);
2>构造代码块;
3>属性显式初始化;
其中:2和3根据程序的书写顺序,顺序执行。
⑦隐式三步执行完毕之后,才会执行构造方法里面的代码;
⑧如果有方法调用,此时再执行方法,没有不执行。
总结:
1.先加载类:考虑继承,先父后子,静态方法不调用不执行;静态属性,静态代码块顺序执行;
2.对象:构造方法的执行:
a.隐式三步:super(参数),考虑继承 构造代码块 属性的显示初始化,顺序执行;
b.构造方法的代码的执行;
c.有方法调用才会执行。



