解释一下程序的输出。。

dragoonj 2004-08-05 12:54:12
有谁告诉我下面程序的输出,及为什么
分不够还可以加

class single{

single(int i){System.out.println("created" + i);}
private static single s = new single(10);
private static int i = 0;
private single ss = creates();
private single creates(){
if (i<10){
i ++;
return new single(11);

}
else
return null;
}


}
public class JTest {
public static void main(String[] argv){
single s2 = new single(0);
single s3 = new single(1);
}

}
...全文
133 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
TinyJimmy 2004-08-05
  • 打赏
  • 举报
回复

1. 装载类
进入类初始化静态变量
private static single s = new single(10);
private static int i = 0;

1.1. 当到 private static single s = new single(10);
创建对象, 初始化对象变量
private single ss = creates();
调用creates(), 递归创建10个对象, 直到i=10;

1.2. 最后从第10个对象调用构建方法single(int i), i=10
打印 created11
然后是第9,8,.....1
一共打印10个11

1.3. 结束创建静态变量创建
private static single s = new single(10);
打印created10

1.4. 初始化变量 i
初始化前 i = 10
private static int i = 0;
类初始化完毕 i=0

2.1 回到主函数的创建, 创建对象
single s2 = new single(0);
创建对象, 初始化对象变量
private single ss = creates();
如1.1 - 1.2

2.2 完成初始化对象
打印created10

2.3 主函数第二个对象创建
single s2 = new single(0);
同样也会调用creates(), 只是由于i=10, 返回null
打印created10

难点
初始化类是按顺序执行的, static i = 0;会重新更改i的值, 如果改为 private static int i; 这样结果就没有后来的10个created11了
类被初始化前, 其方法是可以被内部调用的(一段执行代码而以)
dragoonj 2004-08-05
  • 打赏
  • 举报
回复


2、执行new single(0);
执行
private single ss = creates();
同上递归调用,只不过调用前i的值已为11,输出10次“created11”。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``
//就是后面10次“created11”不太明白,i不是已经是11了吗。
执行构造方法,输出“created0”(传的参数是0)。
ntzls 2004-08-05
  • 打赏
  • 举报
回复
执行single s3 = new single(1);时类已载入,执行上述第2部即可。
ntzls 2004-08-05
  • 打赏
  • 举报
回复
以single s2 = new single(0);为例

1、装入类,为静态成员分配空间
执行
private static single s = null;
private static int i = 0;(static i仅分配一次)

执行static single s = new single(10);构造s(仅构造1次)

为s的非静态成员ss赋值,执行
private single ss = creates();
调用
private single creates(){...}
在上述方法内再递归,成功调用10次至i值为11,每次调用i增1,i为static,执行构造方法输出10次“created11”(i的值已递增为11),即逐层退出递归,退出递归后执行构造函数“created10”(传的参数是10)。


2、执行new single(0);
执行
private single ss = creates();
同上递归调用,只不过调用前i的值已为11,输出10次“created11”。
执行构造方法,输出“created0”(传的参数是0)。
p9919cn 2004-08-05
  • 打赏
  • 举报
回复
java的编译顺序是从上至下的,这一点你可以找一些关于此类的书翻阅一下。
zncn2 2004-08-05
  • 打赏
  • 举报
回复
可以输出结果却是这样!!!

created11
created11
created11
created11
created11
created11
created11
created11
created11
created11
created10
created11
created11
created11
created11
created11
created11
created11
created11
created11
created11
created0
created1


真是不可思议static成员反而生成的晚了!!!

将构造函数改成这样也无济于事
single(int i){
System.out.println("created" + i);
System.out.flush();
}

关注高手解释原因
hl_longman 2004-08-05
  • 打赏
  • 举报
回复
private static single s = new single(10);
private static int i = 0;
这两个东东是静态的,在MAIN()前他们就产生对象。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧