SimonHook 2015-06-24 07:34 采纳率: 100%
浏览 1643
已采纳

一道Java笔试题,求解答(关于类的加载与初始化)

自己查了一些资料,还是看不懂这个程序的输出结果,求各位详细解释初始化和执行过程,谢!

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

/*
Output:
1:j i=0 n=0
2:构造块 i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
9:j i=8 n=100
10:构造块 i=9 n=101
11:init i=10 n=102
*/

  • 写回答

5条回答 默认 最新

  • JonsonJiao 2015-06-24 10:09
    关注

    这道题比较复杂的地方就是静态变量里面有两个自己的实例对象t1和t2,容易混乱,再有就是静态块调用时记得n已经赋值99了。

    详细说明下:

    第一梯队是静态变量和静态块,跟类的实例没有关系的,只要类加载就会先运行,且跟前后顺序有关,因此本题中从k变量开始按顺序执行static开头的;

    第二梯队是普通变量和代码块,这个要到初始化变量的时候才会调用,很好理解,变量是实例的变量,没有实例是不会初始化普通变量的,普通变量和代码块的执行顺序也是按定义的前后执行,比如int j要在代码块的前面执行;这里特殊的是第三行初始化t1时产生了实例对象,因此需要调用t1的普通变量j和代码块,因此先输出的是j;

    第三梯队是构造方法,输出的最后一行就是调用构造方法输出的。

    因此执行的顺序是 k-->t1(t1.j,t1.代码块,t1构造函数)-->t2(t2.j,t2.代码块,t2构造函数)-->i-->n-->静态块-->main函数(初始化init(init.j,init.代码块,init构造函数));

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 ATAC测序到底用什么peak文件做Diffbind差异分析
  • ¥15 安装ubantu过程中第一个vfat 文件挂载失败
  • ¥20 GZ::CTF如何兼容一些靶机?
  • ¥15 etcd集群部署问题
  • ¥20 谁可以帮我一下问一下各位
  • ¥15 为何重叠加权后love图的SMD与svyCreateTableOne函数绘制基线表的不一致
  • ¥15 QFILHelper怎么恢复全字库,提示进程已完成,只能恢复分区文件
  • ¥150 求 《小魔指》街机游戏机整合模拟软件
  • ¥20 你好,我想问下easyExcel下拉多选,或者复选框可以实现吗
  • ¥20 双非跨考工科哪个专业和方向就业前景好?