读书人

Java种、实例的初始化顺序

发布时间: 2013-09-24 10:59:52 作者: rapoo

Java类、实例的初始化顺序

今晚是阿里巴巴 2013 校园招聘的杭州站笔试。下午匆忙看了两张历年试卷,去现场打了瓶酱油。

题目总体考察点偏基础,倒数第二题(Java 附加题)比较有趣,考察了 Java 初始化机制的细节,在此摘录出来。

题目

求如下 java 代码的输出:

12345678910111213141516171819202122232425262728293031
class T  implements Cloneable{  public static int k = 0;  public static T t1 = new T("t1");  public static T t2 = new T("t2");  public static int i = print("i");  public static int n = 99;    public int j = print("j");  {      print("构造快");  }    static {      print("静态块");  }    public T(String str) {      System.out.println((++k) + ":" + str + "    i=" + i + "  n=" + n);      ++n; ++ i;  }    public static int print(String str){      System.out.println((++k) +":" + str + "   i=" + i + "   n=" + n);      ++n;      return ++ i;  }    public static void main(String[] args){      T t = new T("init");  }}

分析

代码主要考察的是类、变量初始化的顺序。

一般的,我们很清楚类需要在被实例化之前初始化,而对象的初始化则是运行构造方法中的代码。

本题的代码显然没有这么简单了。本题中涉及到了static {…}{…}这种形式的代码块,以及在类的静态变量中初始化该类的对象这种交错的逻辑,容易让人焦躁(类似于密集恐惧症吧=()。实际上,按照类的装载、链接和初始化逻辑,以及对象初始化的顺序来思考,不难得到答案。

代码组成

读书人网 >编程

热点推荐