静态代码块、代码块、构造函数、匿名内部类、匿名内部类中的代码块
VO.java
public class VO { // 唯一测试用属性 private int age; // 普通代码块 { System.out.println("VO 普通代码块..."); } // 静态代码块 static { System.out.println("VO 静态代码块..."); } // 无参构造函数 public VO() { super(); System.out.println("VO 无参构造函数...."); } // 有参参构造函数 public VO(int age) { super(); this.age = age; System.out.println("VO 有参参构造函数...."); System.out.println("VO 有参构造函数中的 age = " + this.age); } // getters/setters public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "VO [age=" + age + "]"; } }
Test.java
/** * 静态代码块、代码块、构造函数、匿名内部类、匿名内部类中的代码块 */ public class Test { // 普通代码块 { System.out.println("Test 普通代码块...."); } // 静态代码块 static { System.out.println("Test 静态代码块...."); } // main方法 public static void main(String[] args) { // 声明 VO vo = null; // 匿名内部类 vo = new VO(21) { // 匿名内部类,继承VO对象。 // 匿名内部类中的普通代码块 { System.out.println("匿名内部类 普通代码块...."); // 年龄增加10 this.setAge(this.getAge() + 10); } /* // 匿名内部类中的静态代码块, 编辑不能通过 static { } */ }; System.out.println(vo); // VO [age=31] }
}
执行main方法后的打印结果:
Test 静态代码块.... VO 静态代码块... VO 普通代码块... VO 有参参构造函数.... VO 有参构造函数中的 age = 21 匿名内部类 普通代码块.... VO [age=31]
得到的结论:
总结: ======================================================================== 1)静态代码块:即便不构造对象也会执行,它在类加载的时候就会执行. 证据:没有构造(new)Test对象,但是Test类中的静态代码块执行了。 2)普通代码块:只会在构造对象的时候执行。 证据:Test类中的普通代码块没有执行,而VO类中的普通代码块执了。 3)虽然普通代码块是在构造对象的时候执行,但是普通代码块的执行时机是早于构造函数的执行时机的。 证据:VO普通代码块先执行,VO有参参构造函数再执行。 4)匿名内部类中的代码块执行时机在匿名内部类的父类的构造函数执行之后。 证据:VO有参参构造函数先执行,匿名内部类普通代码块再执行。 5)匿名内部类不仅可以继承抽象类,接口,也可以继承一个普通类。 证据:如本例,匿名内部类不是实现或重写父类的方法,而是增加了一个普通代码块。执行时机在父类的构造函数之后。 6)匿名内部类中不可以写静态代码块。 证据:Eclipse中直接编辑不能通过。