每次创建对象时都会执行非静态初始化块,这不是完全可以由构造函数来完成吗?非静态初始化有什么其他用途吗?

解决方案 »

  1.   

    一:初始化块——非静态初始化块
       变量的赋值,有两种常用的方式。
       1:变量声明中赋值。
       2:构造函数中赋值。
       事实上,java提供了第三种机制——初始化块。
      
      例如:
    class InitBlock {
     //构造函数赋值
     public InitBlock() {
      //对另一构造函数的调用,且必须为第一行
      this("fff",300);
      bi = 200;
      str1 = "abc";
      System.out.println("constructor method A");
     }
     //构造函数赋值
     public InitBlock(String str,int b) {
      this.bi = b;
      this.str1 = str;
      System.out.println("constructor method B");
     }
     //初始化块
     //初始化块赋值
     {
         bi = 100;
         str1 = "string";
         b = 180;
         System.out.println("init block~~~~");
     }
     //初始化块
     {
      System.out.println("second");
     }
     
     private int bi;
     private String str1;
     private int ab = 10;//声明中赋值
     private static int b;
     
     public static void main(String[] args) {
      InitBlock ib = new InitBlock();
      System.out.println("bi = "+ib.bi);
      System.out.println(InitBlock.b);
     }

     关于初始化块:
     a.一个类可以有多个非静态初始化块初始化块,按照初始化块的顺序执行。
     
     b.非静态初始化块是在构造类对象时执行,先执行初始化块,再执行构造主体部分。
     
     c:非静态初始化块能对静态变量,实例变量进行初始化
     
     构造器的具体处理步骤:
     1)所有数据域被初始化为默认值(0、false或null)。2)按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块。3)如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。4)执行这个构造器的主体。
     
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/winer2008/archive/2009/07/12/4341568.aspx