黑马程序员技术交流社区

标题: 关于代码块的使用 [打印本页]

作者: didixyy    时间: 2015-10-6 16:07
标题: 关于代码块的使用
  1. class top
  2. {
  3.         static {
  4.                 System.out.println("top的静态初始化块");
  5.         }
  6.         {
  7.                 System.out.println("top的普通初始化块");
  8.         }
  9.         public top()
  10.         {
  11.                 System.out.println("top的无参数初始化块");
  12.         }
  13. }
  14. class Mid extends top
  15. {
  16.         static {
  17.                 System.out.println("Mid的静态初始化块");
  18.         }
  19.         {
  20.                 System.out.println("Mid的普通初始化块");
  21.         }
  22.         public Mid()
  23.         {
  24.                 System.out.println("Mid的无参数构造器");
  25.         }
  26.         public Mid(String msg)
  27.         {
  28.                 this();
  29.                 System.out.println("Mid的带参数初构造器,参数:"+msg);
  30.         }
  31. }
  32. class low extends Mid
  33. {
  34.         static {
  35.                 System.out.println("low的静态初始化块");
  36.         }
  37.         {
  38.                 System.out.println("low的普通初始化块");
  39.         }
  40.         public low()
  41.         {
  42.                 super("我是参数");
  43.                 System.out.println("执行low的无参数构造器");
  44.         }
  45. }
  46. public class TestDaiMaKuai {
  47.         public static void main(String[] args) {
  48.                 new low();
  49.                 new low();
  50.         }
  51. }
复制代码

执行结果为

作者: c4anger    时间: 2015-10-6 16:11
图片挂了……建议保存到本地再上传。
作者: didixyy    时间: 2015-10-6 16:14
第一次创建low对象的时候,系统中部存在low类,所以需要先初始化并加载low类,初始化会从其类的顶层父类开始,先执行静态初始化块,按照顶层父类---父类---本类的顺序执行,但是一旦low类初始化后,该类会在虚拟机里一直存在,所以第2次执行  new low();的时候就没有再进行初始化了。
所以初始化块的顺序是,顶层父类静态初始化块>>>父类静态初始化块>>>本类静态初始化块>>>顶层父类普通初始化块>>>顶层父类构造器>>>父类普通初始化块>>>父类构造器>>>本类普通初始化块>>>本类构造器
作者: didixyy    时间: 2015-10-6 16:16
挂了的图重新上传一下

QQ截图20151006160024.png (152.66 KB, 下载次数: 4)

QQ截图20151006160024.png





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2