注:下列代码中的注释都是JUnit4单元测试运行结果。
首先,没有父类的(父类是Object)的类A
package Static.of; public class A { { System.out.println("我是父类-----大括号中的代码"); } static{ System.out.println("我是父类-------static代码块"); } public A(){ System.out.println("我是父类A----------的构造方法"); } }
@Test public void fathClass(){ A a = new A();//父类 /** * 我是父类-------static代码块 我是父类-----大括号中的代码 我是父类A----------的构造方法 */ }
由上面运行结果可知:只要没有父类(只有Object作为父类)那么执行顺序:static代码块,大括号,构造方法。
继承A的类B
package Static.of; public class B extends A { { System.out.println("我是子类大括号中的代码"); } static{ System.out.println("我是子类static代码块"); } public B(){ System.out.println("我是子类B的构造方法"); } }
继承A的类C
package Static.of; public class C extends A { { System.out.println("我是C类 中的大括号"); } public C (){ System.out.println("我是C中的构造方法"); } }
@Test
public void sonBClass(){
B b = new B();
/**
* 我是父类-------static代码块
我是子类static代码块
我是父类-----大括号中的代码
我是父类A----------的构造方法
我是子类大括号中的代码
我是子类B的构造方法
*/
}
@Test public void sonCClass(){ C c = new C(); /** * 我是父类-------static代码块 我是父类-----大括号中的代码 我是父类A----------的构造方法 我是C类 中的大括号 我是C中的构造方法 */ }
多态语法创建对象
@Test public void polymorphicAB(){ A a = new B(); /** * 我是父类-------static代码块 我是子类static代码块 我是父类-----大括号中的代码 我是父类A----------的构造方法 我是子类大括号中的代码 我是子类B的构造方法 */ } @Test public void polymorphicAC(){ A a = new C(); /** * 我是父类-------static代码块 我是父类-----大括号中的代码 我是父类A----------的构造方法 我是C类 中的大括号 我是C中的构造方法 */ }
根据例子总结:
结果是集合{父类static,子类static,父类大括号,父类构造函数,子类大括号,子类构造函数}的一个子集
{}大括号里的是初始化块,这里面的代码在创建java对象时执行,而且在构造器之前!其实初始化块就是构造器的补充,初始化块是不能接收任何参数的,定义的一些所有对象共有的属性、方法等内容时就可以用初始化块了初始化!! 好处是可以提高初始化块的复用,提高整个应用的可维护性。