/* Demo of initialization blocks in Java. * * Written 8/2005 by Wayne Pollock, Tampa Florida USA * * Steps to initialize ``f'' from the code: Foo f= new Foo(); * * 1. Classloader locates Foo.class file, and any dependent classes * (e.g.,superclasses). * 2. Byte code is verified. * 3. Sufficient RAM is allocated for all Class object fields. * 4. All static properties are initialized to default (zero, false, null) * values. * 5. Static fields and static initialization blocks are executed in the order * they appear. * 6. Sufficient RAM is allocated for all instance fields, included inherited * ones. * 7. All instance properties are initialized to default (zero, false, null) * values. * 8. Instance variables and initialization blocks are executed in the order * they appear. * 9. If the first line of the matched constructor calls a second constructor * (via this), that constructor is invoked. (Constructor chaining.) * 10. If a constructor is invoked (directly or via chaining) that doesn't start * with a call to this, a superclass' constructor is invoked. You can pick * one using super, or if the constructor doesn't start with a super call, * the superclass' no-arg constructor will be used. * 11. The body of the matched constructor is executed. * * Steps 1-5 occur only once in the lifetime of the JVM. The rest occur each * time a new object is created. */ class InitBlockDemo { private static int nextID; public int idNum; public String name; static { nextID = 1; // complex DB lookup goes here // Add shutdown hook here } { idNum = nextID++; // Run before any constructor } InitBlockDemo () { this( "unknown" ); // Constructor chaining } InitBlockDemo ( String name ) { // Object's no-arg constructor is invoked here. this.name = name; } public static void main ( String [] args ) { InitBlockDemo ibd1 = new InitBlockDemo( "Hymie" ); InitBlockDemo ibd2 = new InitBlockDemo(); System.out.println( "ibd2.idNum = " + ibd2.idNum ); } }