初始化
创建对象的过程
1: 首次创建类或者首次访问类的静态方法/静态域, 定位到该类的 .class 文件
2: 载入 .class 文件, 静态初始化的所有动作都会执行, 因此静态初始化只在 .class 对象首次加载时进行一次
3: new 对象, 首先在堆上分配足够的空间给对象
4: 这块存储空间会被清 0, 基本类型设为默认值, 引用设为 null
5: 执行字段定义处的初始化动作
6: 执行构造器
初始化顺序: 静态变量 -> 普通变量 -> 构造器
java 中创建和初始化是一体的, 创建的时候就已经有初始化操作, 即使想延后初始化(比如像在构造器里)
对类中已赋默认值的 static final 的变量的调用不会触发其它静态对象的初始化
初始化变量的位置
- 定义的地方
- 构造器里
- 使用时(惰性初始化)
- 使用实例赋值
基本数据类型初始化时的默认值
- boolean > false
- char > 0
- byte > 0
- short > 0
- int > 0
- long > 0
- float > 0.0
- double > 0.0
- 其它类型/非基本数据类型 > null
属性/变量 初始化时机和顺序
- 变量初始化的顺序由 声明顺序 决定
- 类里的属性变量, 声明后未赋值; 在构造方法里赋值, 但是 在构造方法执行之前, 属性变量已经被赋值过一次
public class TInit{
private int i;
public TInit(){
i=7;// 在赋值之前, i 已经被默认赋值为 0
}
}
实例初始化子句
public class TInit{
private CA ca;
{
ca=new CA(); // {} 里的这条语句会在 构造方法执行之前执行
}
public TInit(){
}
}
new TInit();
静态变量初始化
静态变量在这个类被首次实例化之后初始化 一次, 之后再次该类再次实例化也不会再次初始化
静态类初始化 在普通变量之前, 如果一个类中有多个静态变量那么会按照定义的先后顺序初始化