大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果。这实际上是在考查我们对于继承情况下类的初始化顺序的了解。

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

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. 构造器

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

Java代码 
  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. 子类--构造器

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

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

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

Java代码 
  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

大家可以随意改变变量a、变量b以及静态初始化块的前后位置,就会发现输出结果随着它们在类中出现的前后顺序而改变,这就说明静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。

转载于:https://www.cnblogs.com/leetcode/p/3199779.html

java 面试题解惑一 类的初始化顺序相关推荐

  1. Java复习总结之解析类的初始化顺序

    引言 当我们需要做一些必要的事情时,我们会根据具体的情况来确定先做什么,再做什么,就像这件事很急,所以我们先把它完成.那件事不着急,我们可以把它放在靠后的顺序再做.同理,对于Java来说,对于一个类的 ...

  2. 臧圩人:java面试题解惑系列(一)——类的初始化顺序学习笔记

    1.对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是 (静态变量.静态初始化块)>(变量.初始化块)>构造器 2. 父类--静态变量 父类--静态初始化块 子类- ...

  3. JAVA面试题解惑系列(十)——话说多线程

    JAVA面试题解惑系列(十)--话说多线程 关键字: java 面试题 多线程 thread 线程池 synchronized 死锁 作者:臧圩人(zangweiren) 网址:http://zang ...

  4. 读《臧圩人的Java面试题解惑系列》

    原文:http://zangweiren.javaeye.com/blog/208122 读了臧圩人的Java面试题解惑系列第一章:类的初始化顺序 总结: 1,(静态变量.静态初始化块)>(变量 ...

  5. java类成员初始化_简单了解Java类成员初始化顺序

    这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类中包含7中成员: 1.静态变量 static 2 ...

  6. 学习臧圩人Java面试题解惑系列总结

    以下内容为学习臧圩人 系列文章的简单总结: 1.类的初始化顺序 没有继承关系:静态变量.静态初始化块->变量.初始化块->构造器. 涉及继承关系:父类静态变量.父类静态初始化块->子 ...

  7. Java 类的初始化顺序

    Java 类的初始化顺序 Java中类的初始化顺序是:父类静态代码块-->子类静态代码块-->父类非静态代码块-->父类构造器-->子类非静态代码块-->子类构造器. 测 ...

  8. java 初始化参数_JAVA类的初始化顺序与initialize参数

    JAVA类的初始化顺序依次是:(静态变量.静态初始化块)->(变量.初始化块)->构造函数, 相同级别的以定义顺序为准,  且静态变量和静态初始化块只初始化一次.通过下面的代码来验证. p ...

  9. Java类的初始化顺序

    对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器. 初始化顺序图示: 我们也可以通过下面的测试代码来验证这一 ...

最新文章

  1. SSH-Auditor:一款SSH弱密码探测工具
  2. Android 热修复 HotFix 混淆apk生成patch包方案
  3. 【算法知识】详解希尔排序算法
  4. 面试题 08.02. 迷路的机器人
  5. 韩国央行行长李柱烈:加密货币的波动给金融稳定带来风险
  6. jquery表单对象属性选择器:enabled、:disabled、:checked、:selected
  7. day12 装饰器的进阶
  8. 学习使用autotools
  9. php+ci+db+debug,[PHP] Web Framework : CodeIgniter MySQL Database 使用教學
  10. 深圳市最新10区地图json文件,使用与echarts,百度,高德等免费
  11. Modscan32使用注意事项
  12. Linux本地网络软件仓库搭建
  13. 智慧工地解决方案施工升降机智能监控系统
  14. zblog插件全自动采集伪原创发布插件免费
  15. 红色警戒2修改器原理百科(八)
  16. 蓝牙(BlueTooth)技术标准
  17. Mysql数据库数据拆分之分库分表总结
  18. 计算机专业电脑i5与i7的区别,处理器i5和i7有什么区别 处理器i5和i7的区别介绍【图文】...
  19. 微博登录显示服务器解析失败怎么办,微博air登录失败, air无法登录的原因 -电脑资料...
  20. 《C++》第1章——第111章

热门文章

  1. idea导入gitlab上面的项目
  2. i5 1135g7什么水平_i7-10510U和i5-1135G7对比,该怎么选择呢?
  3. orm和mysql_orm与mysql
  4. or函数 java_Java OptionalInt orElseGet()用法及代码示例
  5. mysql 子查询模糊匹配_sql中的查询(模糊查询,子查询,联表查询)
  6. 实现页面适配_微信公众号文章页面适配深色模式
  7. 超30万字的中台实战100讲2.0最终版(建议收藏!)
  8. 2021年全球营销趋势报告
  9. 测试两个主机之间的连通性_常用的光缆4种测试方法介绍
  10. CCF受理“大数据专家委员会”2019年委员与通讯委员申请