Java中类的初始化顺序

来源:互联网 发布:微信发淘宝链接打不开 编辑:程序博客网 时间:2024/05/17 01:16
/**
1 每个类初始化时,会先初始化它的static再执行构造方法,
当static已经执行过后,该类的新的实例不会再执行static
2 该类如果继承了某个类则父类的static会先初始化。
3 某个类即便有static main方法,并且该类作为执行类,
在执行main方法的过程中,只要不涉及到该类,则static都不会执行---->修正执行main方法的第一行代码前,会执行该类中定义的static代码块和初始化其中的static变量,按照定义顺序来执行初始化.

* 因此,可以得到如下顺序:
* 1 父类static 变量/代码块 初始化(即使父类static是private的也会初始化,只会初始化一次)
* 2 子类static 变量/代码块 初始化
* 3 父类构造方法
* 4 子类构造方法
* static变量和static代码块的初始化顺序按照书写的先后顺序初始化

* 子类可以覆盖父类的方法,覆盖的时候可以扩大控制符的范围,而不能缩小范围【如protected-->public可以,protected-->friendly不可】



* 关于子类和父类构造方法参数等不一致时问题
* 1 父类构造函数无参数,子类构造也无参数,且子类该构造函数中未调用或者显式采用super()方式调用时,
* 父类无参构造函数和子类无参构造函数都会执行
* 2 如果子类无参构造函数中,显式调用父类有参构造函数,则父类无参构造函数不会被执行

* 由此可以知道:
* 子类初始化时,执行子类构造函数(不管是有参还是无参的子构造函数)之前,默认会首先执行父类无参数构造函数
* 但是如果在子类构造函数(不管是有参还是无参的子构造函数)中,显式调用父类有参构造函数,
则会执行父类被显式调用的有参构造函数而不会执行父类无参构造函数。
* /

下面是一个类中的静态变量、变量以及构造函数的初始化顺序。

 

Java代码 
  1. public class InitialOrderTest   
  2. {  
  3.     public static String staticField = "静态变量";    
  4.     public String field = "变量";    
  5.     
  6.     static   
  7.     {    
  8.        System.out.println(staticField);    
  9.        System.out.println("静态初始化块");    
  10.     }    
  11.    
  12.     {    
  13.        System.out.println(field);    
  14.        System.out.println("初始化块");    
  15.     }    
  16.    
  17.     public InitialOrderTest()   
  18.     {    
  19.         System.out.println("构造器");    
  20.     }    
  21.    
  22.     public static void main(String[] args)   
  23.     {    
  24.         new InitialOrderTest();          
  25.     }    
  26. }  
  27.   
  28. //**********************  
  29. //输出结果为;  
  30. //**********************  
  31. //静态变量  
  32. //静态初始化块  
  33. //变量  
  34. //初始化块  
  35. //构造器  

 

下面是子类和父类中静态变量、变量以及构造函数的初始化顺序。

 

Java代码 
  1. public class InitialOrder extends Parent  
  2. {  
  3.     public static String s_StaticField = "子类--静态变量";    
  4.     public String s_Field = "子类--变量";  
  5.       
  6.     static   
  7.     {    
  8.         System.out.println(s_StaticField);    
  9.         System.out.println("子类--静态初始化块");    
  10.     }    
  11.          
  12.     {    
  13.         System.out.println(s_Field);    
  14.         System.out.println("子类--初始化块");    
  15.     }    
  16.       
  17.     public InitialOrder()   
  18.     {    
  19.         System.out.println("子类--构造器");    
  20.     }    
  21.       
  22.     public static void main(String[] args)   
  23.     {    
  24.         new InitialOrder();    
  25.     }    
  26. }  
  27.   
  28. class Parent   
  29. {    
  30.     public static String p_StaticField = "父类--静态变量";    
  31.     public String p_Field = "父类--变量";    
  32.     
  33.     static   
  34.     {    
  35.         System.out.println(p_StaticField);    
  36.         System.out.println("父类--静态初始化块");    
  37.     }    
  38.    
  39.     {    
  40.         System.out.println(p_Field);    
  41.         System.out.println("父类--初始化块");    
  42.     }    
  43.    
  44.     public Parent()   
  45.     {    
  46.         System.out.println("父类--构造器");    
  47.     }    
  48. }    
  49.   
  50. //**********************  
  51. //输出结果为;  
  52. //**********************  
  53. //父类--静态变量  
  54. //父类--静态初始化块  
  55. //子类--静态变量  
  56. //子类--静态初始化块  
  57. //父类--变量  
  58. //父类--初始化块  
  59. //父类--构造器  
  60. //子类--变量  
  61. //子类--初始化块  
  62. //子类--构造器  
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 痔疮肉球特别痒怎么办 长了个小痔疮怎么办 产后4天没大便怎么办 7个月孕妇痔疮怎么办 运动完恶心想吐怎么办 跑步后恶心想吐怎么办 肠子不蠕动严重便秘怎么办 怀孕八个月严重便秘怎么办 怀孕七个月便秘严重怎么办 怀孕两个月便秘严重怎么办 3岁宝宝上火便秘怎么办 7个月的宝宝贫血怎么办 9个月婴儿贫血怎么办 肛裂大便有血怎么办 生完宝宝肛门痛怎么办 肛周脓肿出血了怎么办 胃胀怎么办简单的办法 吃多了胃胀难受怎么办 胃窦炎胆汁反流怎么办 怀孕总胆汁酸高怎么办 胃里胆汁反流怎么办 苦胆水吐出来了怎么办 喝多了吐胆汁怎么办 吐出黄水苦水是怎么办 喝酒喝的一直吐怎么办 孕期总胆汁酸高怎么办 孕早期胆汁酸高怎么办 孕妇总胆汁酸高怎么办 宝宝一天吐了6次怎么办 肛周脓肿破了怎么办 肛周脓肿发烧了怎么办 肛周脓肿便血该怎么办 婴儿得肛周脓肿怎么办 水痘长在龟头上怎么办 轻度萎缩性胃炎伴肠化怎么办 肺癌晚期腿肿了怎么办 胸骨剑突按压痛怎么办 22岁有白头发怎么办 血热导致掉头发怎么办 36岁脱发严重该怎么办 血热引起的脱发怎么办