例子:
- class A{
- public String context=test();
- public static int num=getNum();
- {
- System.out.print("A3");
- }
- static{
- System.out.print("A1,");
- }
- public A(){
- System.out.print("A2,");
- }
- public String test()
- {
- String str="A.test(),";
- System.out.print(str);
- return str;
- }
- public static int getNum()//它只属于A
- {
- System.out.print("A.getNum(),");
- return 11;
- }
- }
- class B extends A{
- {
- System.out.print("c");
- }
- static{
- System.out.print("a,");
- }
- public B(){
- System.out.print("b,");
- }
- public String test()//覆盖
- {
- String str="B.test(),";
- System.out.print(str);
- return str;
- }
- public static int getNum()//它只属于B,不能覆盖
- {
- System.out.print("B.getNum(),");
- return 21;
- }
- }
- public class InitTest{
- public static void main(String[] ars){
- new B(); //执行到此处,结果: A.getNum(),A1,a,B.test(),A3A2,cb,
- System.out.println();
- new B(); //执行到此处,结果: B.test(),A3A2,cb,
- }
- }
首先在加载类时初始化static变量,同时按定义的顺序执行static{}块;
然后初始化按定义的顺序初始化非static变量;
最后执行构造函数;
以上的每个步骤都是先执行父类部分,再执行子类部分;
附:我的理解
总而言之:先静(变量+块+方法,三者不分先后,按照在代码中出现的顺序初始化);后非(变量+块+函数+构造函数,同样不分先后,按照在代码中出现的顺序初始化)。以上均先执行父类再执行子类。
注意的是,静态XX只初始化一次,所以我们得到了第二次new B()的结果。