好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

面试题解惑系列一类的初始化顺序.doc

4页
  • 卖家[上传人]:平***
  • 文档编号:12313814
  • 上传时间:2017-10-18
  • 文档格式:DOC
  • 文档大小:45.17KB
  • / 4 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • JAVA 面试题解惑系列(一)——类的初始化顺序大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果这实际上是在考查我们对于继承情况下类的初始化顺序的了解 我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器我们也可以通过下面的测试代码来验证这一点: Java 代码 1. public class InitialOrderTest { 2. 3. // 静态变量 4. public static String staticField = "静态变量"; 5. // 变量 6. public String field = "变量"; 7. 8. // 静态初始化块 9. static { 10. System.out.println(staticField); 11. System.out.println("静态初始化块"); 12. } 13. 14. // 初始化块 15. { 16. System.out.println(field); 17. System.out.println("初始化块"); 18. } 19. 20. // 构造器 21. public InitialOrderTest() { 22. System.out.println("构造器"); 23. } 24. 25. public static void main(String[] args) { 26. new InitialOrderTest(); 27. } 28.} 运行以上代码,我们会得到如下的输出结果: 1. 静态变量 2. 静态初始化块 3. 变量 4. 初始化块 5. 构造器 这与上文中说的完全符合。

      那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果: Java 代码 1. class Parent { 2. // 静态变量 3. public static String p_StaticField = "父类--静态变量"; 4. // 变量 5. public String p_Field = "父类--变量"; 6. 7. // 静态初始化块 8. static { 9. System.out.println(p_StaticField); 10. System.out.println("父类--静态初始化块"); 11. } 12. 13. // 初始化块 14. { 15. System.out.println(p_Field); 16. System.out.println("父类--初始化块"); 17. } 18. 19. // 构造器 20. public Parent() { 21. System.out.println("父类--构造器"); 22. } 23.} 24. 25.public class SubClass extends Parent { 26. // 静态变量 27. public static String s_StaticField = "子类--静态变量"; 28. // 变量 29. public String s_Field = "子类--变量"; 30. // 静态初始化块 31. static { 32. System.out.println(s_StaticField); 33. System.out.println("子类--静态初始化块"); 34. } 35. // 初始化块 36. { 37. System.out.println(s_Field); 38. System.out.println("子类--初始化块"); 39. } 40. 41. // 构造器 42. public SubClass() { 43. System.out.println("子类--构造器"); 44. } 45. 46. // 程序入口 47. public static void main(String[] args) { 48. new SubClass(); 49. } 50.} 运行一下上面的代码,结果马上呈现在我们的眼前: 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. // 静态初始化块 6. static { 7. System.out.println("静态初始化块"); 8. } 9. 10. // 静态变量 11. public static TestB b = new TestB(); 12. 13. public static void main(String[] args) { 14. new TestOrder(); 15. } 16.} 17. 18.class TestA { 19. public TestA() { 20. System.out.println("Test--A"); 21. } 22.} 23. 24.class TestB { 25. public TestB() { 26. System.out.println("Test--B"); 27. } 28.} 运行上面的代码,会得到如下的结果: 1. Test--A 2. 静态初始化块 3. Test--B 大家可以随意改变变量 a、变量 b 以及静态初始化块的前后位置,就会发现输出结果随着它们在类中出现的前后顺序而改变,这就说明静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。

      同样,变量和初始化块也遵循这个规律 了解了继承情况下类的初始化顺序之后,如何判断最终输出结果就迎刃而解了。

      点击阅读更多内容
      相关文档
      高一历史上学期期末考前必刷卷统编版03考试版A4含答案.docx 高中英语考试各题型突破攻略听力篇高一高二高三的都要看.docx 高一历史上学期期末考前必刷卷统编版01考试版A3含答案.docx 高中英语考试各题型突破攻略语法填空篇高一高二高三的都要看.docx 高一历史上学期期末考前必刷卷统编版02考试版A3含答案.docx 高中英语考试各题型突破攻略完形填空篇高一高二高三的都要看.docx 高中英语考试各题型突破攻略作文篇高一高二高三的都要看.docx 高考政治如何规范化答题?.docx 高一历史上学期期末考前必刷卷统编版03考试版A3含答案.docx 高一历史上学期期末考前必刷卷统编版02考试版A4含答案.docx 高一历史上学期期末测试卷01统编版中外历史纲要上129课含答案.docx 日历表2028年日历中文版纵向排版周一开始带周数带农历带节假日调休安排1.docx 日历表2028年日历中文版横向排版周一开始带农历带节假日调休安排1.docx 八年级数学北师大版上册课时练第7章《3 平行线的判定》含答案解析.docx 日历表2029年日历中文版横向排版周一开始带周数带农历带节假日调休安排1.docx 日历表2028年日历中文版纵向排版周一开始带周数带农历.docx 人教版二年级数学下册同步测试-有余数的除法含答案解析3含答案.docx 日历表2028年日历中文版横向排版周一开始带农历1.docx 人教版二年级数学下册同步测试-总复习含答案解析-人教新课标含答案.docx 日历表2028年日历中文版横向排版周一开始带周数带农历1.docx
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.