类的生命周期
Student s=new Student();
在上面短短的一句话中,包括了以下步骤:
加载,连接(验证,准备,解析)初始化,对象生命(对象实例化,垃圾收集,对象终结)卸载类型
- 加载 *.class这个类
- 连接
- 验证:看看加载的类是否正确,数据会不会损坏虚拟机
- 准备:为staic静态变量分配内存,初始化为默认值
- 解析:将符号引用转为直接引用
- 类初始化:给静态信息赋值
- 执行<cl init>方法:类初始化
- 什么时候执行呢:实例化,调用main()函数所在类,调用该类的静态方法
- 对于静态代码块,类初始化的时候执行
- 类初始化完了之后,成员初始化:sex,age这些成员变量和成员方法
- 构造块,可用多次,用来赋值,执行顺序是:静态代码块>构造块>构造方法
static{ age=9;//,这里是静态代码块,age无法访问但可赋值 }
{
age=9;
}//这里是构造块,在构造器之前执行
- 对象创建的过程
- 加载类
- 在堆中分配内存
- 给属性赋值
- 初始化属性
- 构造块
- 构造器new
- 与栈中的指定变量相连,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 }