Java 静态块 、构造块、构造函数执行顺序

来源:互联网 发布:知乎公司地址 编辑:程序博客网 时间:2024/05/29 14:48

请先参照这两个帖子:
http://blog.csdn.net/kingzone_2008/article/details/45015301
http://bbs.csdn.net/topics/391001417%20%22%22
静态块:用static申明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>main()>构造块>构造方法
静态块和静态属性优先执行,谁在前就先执行谁
注意:
1、每调用一次构造方法,则执行一次构造块
2、静态块只在类加载的时候加载一次
3、有多个静态变量或块时,按声明顺序加载

public class Practice {      public static void main(String[] args) {          new Father();          new Son();      }  }  class Father {      protected int n = 5;      protected static int m = 5;    public static Father p = new Father();    public static Father p1 = new Father();    {//构造块          n = n * 2;          m = m * 2;          System.out.print("父类**构造块**调用;");        System.out.print("n="+n);          System.out.println("  m="+m);      }      static {//实例化多个对象时,静态块只执行一次,即在第一个实例化对象时执行        m = m * 2;          System.out.println("父类%%静态块%%调用; m="+m);      }      public Father() {  //父类构造函数        this.n = n * 10;          m = m + 10;          System.out.print("父类$$构造函数$$;   n="+n);          System.out.println("    m="+m);      }  }  class Son extends Father {      private int sn=3;      private static int sm=3;      static {          m = m + 2;          sm=sm+2;          System.out.println("【 子类 】@@ 静态块 @@调用;    m="+m);      }      {          n = n + 2;          sn=sn+2;          m = m + 2;          System.out.println("【 子类 】^^ 构造块 ^^调用;");          System.out.println("n="+n);          System.out.println("sn="+sn);          System.out.println("m="+m);      }      public Son() {          this.n = n + 10;          sn=sn+10;          m = m + 10;          System.out.println("【 子 类 】[[ 构造函数 ]];\nn="+n);          System.out.println("m="+m);      }  }   

结果:(一)

父类**构造块**调用;n=10  m=10父类$$构造函数$$;   n=100    m=20父类**构造块**调用;n=10  m=40父类$$构造函数$$;   n=100    m=50父类%%静态块%%调用; m=100父类**构造块**调用;n=10  m=200父类$$构造函数$$;   n=100    m=210【 子类 】@@ 静态块 @@调用;    m=212父类**构造块**调用;n=10  m=424父类$$构造函数$$;   n=100    m=434【 子类 】^^ 构造块 ^^调用;n=102sn=5m=436【 子 类 】[[ 构造函数 ]];n=112m=446

结果(二):【将main()函数的new Son()注释掉的运行结果】

**父类**构造块**调用;n=10  m=10父类$$构造函数$$;   n=100    m=20父类**构造块**调用;n=10  m=40父类$$构造函数$$;   n=100    m=50父类%%静态块%%调用; m=100父类**构造块**调用;n=10  m=200父类$$构造函数$$;   n=100    m=210**

结果(三):【将Father类中的两个引用p、p1注释掉的运行结果,结果二中的new Son();也注释掉】

父类%%静态块%%调用; m=10父类**构造块**调用;n=10  m=20父类$$构造函数$$;   n=100    m=30

结果(四):【将Father类中的两个引用p、p1注释掉的运行结果,结果二中的new Son();不注释掉】

父类%%静态块%%调用; m=10父类**构造块**调用;n=10  m=20父类$$构造函数$$;   n=100    m=30【 子类 】@@ 静态块 @@调用;    m=32父类**构造块**调用;n=10  m=64父类$$构造函数$$;   n=100    m=74【 子类 】^^ 构造块 ^^调用;n=102sn=5m=76【 子 类 】[[ 构造函数 ]];n=112m=86
阅读全文
0 0
原创粉丝点击