(转)java类初始化顺序
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:

  1. public class InitialOrderTest {
  2. // 静态变量
  3. public static String staticField = "静态变量";
  4. // 变量
  5. public String field = "变量";
  6. // 静态初始化块
  7. static {
  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. System.out.println("构造器");
  19. }
  20. public static void main(String[] args) {
  21. new InitialOrderTest();
  22. }
  23. }

运行以上代码,我们会得到如下的输出结果:

  1. 静态变量
  2. 静态初始化块
  3. 变量
  4. 初始化块
  5. 构造器

这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:

  1. class Parent {
  2. // 静态变量
  3. public static String p_StaticField = "父类--静态变量";
  4. // 变量
  5. public String p_Field = "父类--变量";
  6. // 静态初始化块
  7. static {
  8. System.out.println(p_StaticField);
  9. System.out.println("父类--静态初始化块");
  10. }
  11. // 初始化块
  12. {
  13. System.out.println(p_Field);
  14. System.out.println("父类--初始化块");
  15. }
  16. // 构造器
  17. public Parent() {
  18. System.out.println("父类--构造器");
  19. }
  20. }
  21. public class SubClass extends Parent {
  22. // 静态变量
  23. public static String s_StaticField = "子类--静态变量";
  24. // 变量
  25. public String s_Field = "子类--变量";
  26. // 静态初始化块
  27. static {
  28. System.out.println(s_StaticField);
  29. System.out.println("子类--静态初始化块");
  30. }
  31. // 初始化块
  32. {
  33. System.out.println(s_Field);
  34. System.out.println("子类--初始化块");
  35. }
  36. // 构造器
  37. public SubClass() {
  38. System.out.println("子类--构造器");
  39. }
  40. // 程序入口
  41. public static void main(String[] args) {
  42. new SubClass();
  43. }
  44. }

运行一下上面的代码,结果马上呈现在我们的眼前:

  1. 父类--静态变量
  2. 父类--静态初始化块
  3. 子类--静态变量
  4. 子类--静态初始化块
  5. 父类--变量
  6. 父类--初始化块
  7. 父类--构造器
  8. 子类--变量
  9. 子类--初始化块
  10. 子类--构造器

现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。

那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。

同样,我们还是写一个类来进行测试:

  1. public class TestOrder {
  2. // 静态变量
  3. public static TestA a = new TestA();
  4. // 静态初始化块
  5. static {
  6. System.out.println("静态初始化块");
  7. }
  8. // 静态变量
  9. public static TestB b = new TestB();
  10. public static void main(String[] args) {
  11. new TestOrder();
  12. }
  13. }
  14. class TestA {
  15. public TestA() {
  16. System.out.println("Test--A");
  17. }
  18. }
  19. class TestB {
  20. public TestB() {
  21. System.out.println("Test--B");
  22. }
  23. }

运行上面的代码,会得到如下的结果:

  1. Test--A
  2. 静态初始化块
  3. Test--B

转载于:https://www.cnblogs.com/yumo1627129/p/7137283.html

(转)java类初始化顺序 - jackyrong的世界 - 博客园相关推荐

  1. 【知识总结】Java类初始化顺序说明

    微信公众号:努力编程的小猪 如有问题或建议,请公众号留言 Java类初始化顺序说明 一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性 静态方法块: static ...

  2. java类初始化顺序_Java 类的初始化顺序

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次 构造代码块:类中直接用{}定义,每一次创建对象时执行 执行顺序优先级:静态块,main(),构造块,构造方法 1. 构造函数 publi ...

  3. Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序

    构造函数 public HelloA(){//构造函数} 关于构造函数,以下几点要注意: 1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的. 2.构造函数的作用是 ...

  4. 面试题:Java类初始化顺序

    1. 问题来源 你遇到过哪些质量很高的 Java 面试? - ZO01的回答 - 知乎 https://www.zhihu.com/question/60949531/answer/579002882 ...

  5. java 使用webmagic 爬虫框架爬取博客园数据

    java 使用webmagic 爬虫框架爬取博客园数据存入数据库 学习记录   webmagic简介: WebMagic是一个简单灵活的Java爬虫框架.你可以快速开发出一个高效.易维护的爬虫. ht ...

  6. 随机数是骗人的,.Net、Java、C为我作证 - 杨中科 - 博客园

    移动端全链路跟踪保障体系 随机数是骗人的,.Net.Java.C为我作证 - 杨中科 - 博客园

  7. Java类初始化顺序(变量赋值与静态代码块的执行时间)

    前言:最近写代码的时候经常见到见到static代码块,不由对static的执行时间产生了兴趣,进而对类初始化顺序产生了兴趣. 类从编译到执行的过程: 在使用ClassLoader将字节码转换为JVM中 ...

  8. 一文详解Java类初始化顺序

    目录 一.普通类 二.包含继承关系 三.包含接口.抽象类关系 本文将介绍三种情形下的类初始化顺序. 一.普通类 Java类:Animal.java package ztt.继承接口多态.执行顺序测试; ...

  9. JAVA爬虫实践(实践二:博客园)

    分析博客园网站的请求可以发现,博客园的分页请求为POST方式,和知乎的滚动加载类似. 不同的是请求响应返回的是HTML而不是JSON. 这样可以套用上一篇爬知乎的代码,需要修改的部分就是POST方法传 ...

最新文章

  1. Arithmetic
  2. android从放弃到精通第11天 勿忘初心
  3. VTK修炼之道56:图形基本操作进阶_表面重建技术(三维点云曲面重建)
  4. Mongodb ruby driver API(中文)
  5. spring核心之AOP学习总结二
  6. JavaScript 里 window, document, screen, body 这几个名词的区别
  7. 在Matlab2006a中如何创建.net组件
  8. 黑客们的故事(连载三) 因为好奇
  9. ElasticSearch 核心概念介绍_02
  10. Java通过反射访问构造方法
  11. 《程序员面试宝典》精华 编程语言部分
  12. python二进制解码_使用python3对二进制数据进行编码和解码,以将其包含到JSON中...
  13. 亿图图示最新po解直装版(附教程)
  14. 从布朗运动、随机微积分到股票买卖
  15. 自定义video的controls(播放暂停按钮、进度条、快进快退等)
  16. 别再吐槽12306了!有本事你来写架构
  17. vue.jsv-if 的key值问题
  18. Java线程池的四种创建方式
  19. 运营管理模型对计算机软件,生产与运作管理
  20. 基于微信小程序的设备报修系统源码

热门文章

  1. Learning ROS: Service and Client (C++)
  2. ubuntu下载软件安装包
  3. linux cp 强制覆盖
  4. 【ios】Storyboard教程
  5. C#实现HTTP协议:多线程文件传输
  6. Quartz.NET 架构与源代码分析系列 part 2 :Job 作业
  7. [导入]LAMP架构下安装Drupal
  8. 海思Hi3519A 进行4k60 h264编码帧率不足的问题
  9. linux 正则表达式与实践
  10. mysql主从复制思考_Mysql主从复制(拓展博客文章分享及思考)