美文网首页
变量初始化

变量初始化

作者: HELLOWORLD_cb34 | 来源:发表于2017-03-30 16:28 被阅读0次
    • 局部变量不初始化编译报错
    • 类中的字段(成员变量)不初始化会给与默认值
    • 类中的字段初始化在一切之前,在调用构造器前先对变量初始化
    • 先初始化静态变量。再初始化非静态变量,再构造函数
    • 静态初始化只在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
    *///:~
    

    相关文章

      网友评论

          本文标题:变量初始化

          本文链接:https://www.haomeiwen.com/subject/kxodnttx.html