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条)

报告相同问题?

悬赏问题

  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏