变量初始化

  • 局部变量不初始化编译报错
  • 类中的字段(成员变量)不初始化会给与默认值
  • 类中的字段初始化在一切之前,在调用构造器前先对变量初始化
  • 先初始化静态变量。再初始化非静态变量,再构造函数
  • 静态初始化只在class对象首次加载的时候进行一次
  • new对象的时候现在堆上分配相应的存储空间,存储空间清零,引用被置为null,再执行所有出现于字段定义处的初始化工作,最后执行构造器
  • 静态块和静态初始化一样只在类加载的时候执行一次
  • 实例初始化类似静态初始化,只是在每次创建新对象的时候都会执行。

初始化过程

  1. 加载直至根基类

  2. 根基类static域初始化,static域中相对应的类被加载,先初始化static变量(使用时初始化一次

    1. 父类--静态变量
    2. 父类--静态初始化块
    3. 子类--静态变量
    4. 子类--静态初始化块
  3. 从父类开始,开始创建对象(堆上分配空间清零),对象中基本类型设为0,对象引用设为null。

  4. 执行所有出现于字段定义处的初始化动作。

  5. 调用基类构造器,构造器中调用子类的重写方法会深入到继承层次结构内部,但是由于域为0或者NULL可能得不到想要的结果(隐式static方法),实例变量依次初始化,执行构造器剩余部分。

    1. 静态初始化完毕后从基类逐步向下初始化
    2. 父类--变量
    3. 父类--初始化块
    4. 父类--构造器
    5. 子类--变量
    6. 子类--初始化块
    7. 子类--构造器
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
*///:~
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容