文本描述
JAVA面试题解惑系列 (一)类的初始化顺序 关键字: java面试题 初始化 发布时间: 2008-06-26 作者:臧圩人( zangweiren) 网址: zangweiren.javaeye >>>转载请注明出处! <<< 大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的 关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某 种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果。这实际 上是在考查我们对于继承情况下类的初始化顺序的了解。 我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化 顺序依次是(静态变量、静态初始化块) >(变量、初始化块) >构造器。我们也可以通过下 面的测试代码来验证这一点: Java代码 public class InitialOrderTest { //静态变量 public static String staticField = "静态变量 "; //变量 public String field = "变量 "; //静态初始化块 static { System.out.println(staticField); System.out.println("静态初始化块 "); } //初始化块 { System.out.println(field); System.out.println("初始化块 "); } //构造器 public InitialOrderTest() { System.out.println("构造器 "); } public static void main(String[] args) { new InitialOrderTest(); } } 运行以上代码,我们会得到如下的输出结果: 1. 静态变量 2. 静态初始化块 3. 变量 4. 初始化块 5. 构造器 这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获 取最终结果: Java代码 : class Parent { //静态变量 public static String p_StaticField = "父类 --静态变量 "; //变量 public String p_Field = "父类 --变量 "; //静态初始化块 static { System.out.println(p_StaticField); System.out.println("父类 --静态初始化块 "); } //初始化块 { System.out.println(p_Field); System.out.println("父类 --初始化块 "); } //构造器 public Parent() { System.out.println("父类 --构造器 "); } } public class SubClass extends Parent { //静态变量 public static String s_StaticField = "子类 -