- 局部变量不初始化编译报错
- 类中的字段(成员变量)不初始化会给与默认值
- 类中的字段初始化在一切之前,在调用构造器前先对变量初始化
- 先初始化静态变量。再初始化非静态变量,再构造函数
- 静态初始化只在class对象首次加载的时候进行一次
- new对象的时候现在堆上分配相应的存储空间,存储空间清零,引用被置为null,再执行所有出现于字段定义处的初始化工作,最后执行构造器
- 静态块和静态初始化一样只在类加载的时候执行一次
- 实例初始化类似静态初始化,只是在每次创建新对象的时候都会执行。
初始化过程
加载直至根基类
-
根基类static域初始化,static域中相对应的类被加载,先初始化static变量(使用时初始化一次)
- 父类--静态变量
- 父类--静态初始化块
- 子类--静态变量
- 子类--静态初始化块
从父类开始,开始创建对象(堆上分配空间清零),对象中基本类型设为0,对象引用设为null。
执行所有出现于字段定义处的初始化动作。
-
调用基类构造器,构造器中调用子类的重写方法会深入到继承层次结构内部,但是由于域为0或者NULL可能得不到想要的结果(隐式static方法),实例变量依次初始化,执行构造器剩余部分。
- 静态初始化完毕后从基类逐步向下初始化
- 父类--变量
- 父类--初始化块
- 父类--构造器
- 子类--变量
- 子类--初始化块
- 子类--构造器
class Glyph {
void draw() { print("Glyph.draw()"); }
Glyph() {
print("Glyph() before draw()");
draw();
print("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int r) {
radius = r;
print("RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw() {
print("RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
} /* Output:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
若private static int radius = 1;
Glyph() before draw()
RoundGlyph.draw(), radius = 1
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
*///:~