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 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog