7.初始化与清理(类的生命周期和对象的创建过程)

类的生命周期

  Student s=new Student();

  在上面短短的一句话中,包括了以下步骤:

  加载,连接(验证,准备,解析)初始化,对象生命(对象实例化,垃圾收集,对象终结)卸载类型

  • 加载 *.class这个类
  • 连接
  1. 验证:看看加载的类是否正确,数据会不会损坏虚拟机
  2. 准备:为staic静态变量分配内存,初始化为默认值
  3. 解析:将符号引用转为直接引用
  • 类初始化:给静态信息赋值
  1. 执行<cl init>方法:类初始化
  2. 什么时候执行呢:实例化,调用main()函数所在类,调用该类的静态方法
  3. 对于静态代码块,类初始化的时候执行
  4. 类初始化完了之后,成员初始化:sex,age这些成员变量和成员方法
  5. 构造块,可用多次,用来赋值,执行顺序是:静态代码块>构造块>构造方法
static{
age=9;//,这里是静态代码块,age无法访问但可赋值
}
{
age=9;
}//这里是构造块,在构造器之前执行
  • 对象创建的过程
  1. 加载类
  2. 在堆中分配内存
  3. 给属性赋值
  4. 初始化属性
  5. 构造块
  6. 构造器new
  7. 与栈中的指定变量相连,s指向new出来的对象
  • 总结:
  • 先静态后非静态
  • 先声明后赋值
  • 先属性后方法
  • 先父类后子类(后面)

例题

public class Test1 {
    int c;
    static int a=10;//步骤1
    static {
        //System.out.println("hello"+a+b);//2报错,b只能赋值,不能访问
        a++;    //2 a=11
    }
    static int b=9;//3
    {
        b++;
        System.out.println(++b);//7
        System.out.println(d+e);//8,值:11
    }
    static int d=11;//4
    int e=11;
    public Test1(){
        System.out.println(c+a);//9
    }
}
    //主函数
    main(){
        System.out.println(Test1.a);//5
        Test1 t1=new Test1();//6
    }

猜你喜欢

转载自www.cnblogs.com/anzhilanxiao/p/10583335.html