Possible Duplicate:
How is an instance initializer different from a constructor?


当所有必需的工作都可以在构造函数中完成时,为什么我们仍然需要Java中的非静态块?

编辑:在构造函数之前每次都运行非静态块的普通类呢?

最佳答案

除了@Bohemian的答案。

如果您有多个构造函数,则初始化块应避免重复。

public class A {
     final Map<String, String> map = new HashMap<String, String>(); {
        // put things in map.
     }
     final int number; {
        int number;
        try {
            number = throwsAnException();
        } catch (Exception e) {
            number = 5;
        }
        this.number = number;
     }

     public A() { /* constructor 1 */ }
     public A(int i) { /* constructor 2 */ }
}

那些在构造函数之前每次都运行非静态块的普通类呢?

从技术上讲订单是

超级构造函数
  • 始终被称为first
  • 所有初始化程序块按出现顺序排列。
  • 构造函数代码

  • 实际上,所有这些代码都在每个构造函数的字节码中,因此在运行时之前或之后没有任何内容。

    在没有更多关于初始化顺序的困惑之前
    public class Main extends SuperClass {
        {
            System.out.println("Initialiser block before constructor");
        }
    
        Main() {
            System.out.println("Main constructor");
        }
    
        {
            System.out.println("Initialiser block after constructor");
    
        }
    
        public static void main(String... args) {
            new Main() {{
                System.out.println("Anonymous initalizer block");
            }};
        }
    }
    
    class SuperClass {
        SuperClass() {
            System.out.println("SuperClass constructor");
        }
    }
    

    版画
    SuperClass constructor
    Initialiser block before constructor
    Initialiser block after constructor
    Main constructor
    Anonymous initalizer block
    

    08-19 12:10