The difference between your example is the order of operations. In your first example, with the initializer block where you said, the order is:
- Assign 1 to a(in the declaration)
- Output a(in the initializer block)
...but in your example example, it's
- Assign 0 (the default value) to a(effectively in the declaration)
- Output a(in the initialization block)
- Assign 1 to a(in the constructor)
The key to understanding instance initialization for me is this: Instance initialization code is literally copied into the constructors — all of them, including the default one — by the compiler. It's copied in source code order, and it's before anything in the constructor (including super).
Here's a more complete example. Consider this class:
class Example {
    // Instance field with initializer
    private int i = 5;
    // Instance initialization block
    {
        System.out.println(this.i);
    }
    // constructor 1
    Example() {
        System.out.println(this.i * 2);
    }
    // constructor 2
    Example(int _i) {
        this.i = _i;
        System.out.println(this.i * 3);
    }
}
That's compiled into bytecode exactly as though it were this:
class Example {
    // Instance field
    private int i;
    // constructor 1
    Example() {
        // begin copied code
        this.i = 5;
        System.out.println(this.i);
        // end copied code
        System.out.println(i * 2);
    }
    // constructor 2
    Example(int _i) {
        // begin copied code
        this.i = 5;
        System.out.println(this.i);
        // end copied code
        this.i = _i;
        System.out.println(this.i * 3);
    }
}
In both cases above, Oracle's Java 8 outputs the exact same bytecode (as viewed by using javap -c Example after compiling):
Compiled from "Example.java"
class Example {
  Example();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."":()V
       4: aload_0
       5: iconst_5
       6: putfield      #2                  // Field i:I
       9: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      12: aload_0
      13: getfield      #2                  // Field i:I
      16: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      19: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      22: aload_0
      23: getfield      #2                  // Field i:I
      26: iconst_2
      27: imul
      28: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      31: return
  Example(int);
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."":()V
       4: aload_0
       5: iconst_5
       6: putfield      #2                  // Field i:I
       9: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      12: aload_0
      13: getfield      #2                  // Field i:I
      16: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      19: aload_0
      20: iload_1
      21: putfield      #2                  // Field i:I
      24: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      27: aload_0
      28: getfield      #2                  // Field i:I
      31: iconst_3
      32: imul
      33: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      36: return
}