A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 段郎 中级黑马   /  2014-4-27 21:59  /  1327 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

求着段代码的运行过程
public class Test1 {
    public static int k=0;
    public static  Test1 t1=new Test1("t1");
    public static  Test1 t2=new Test1("t2");
    public static int i=print("i");
    public static int n=99;
    public int j=print("j");
    {
            print("构造块");
    }
    static{
            print("静态块");
    }
    public Test1(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) {
            Test1 t=new Test1("init");
    }
}
运行结果如下图
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

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
本帖最后由 伍叶竹 于 2014-4-27 23:34 编辑

好复杂的题,捣鼓了好久一点想法:装载Test1.class,静态变量在类编译时全部初始化,非静态变量仅在实例化时才初始化
.执行:public static  Test1 t1=new Test1("t1");  在调用构造函数之前对实例成员初始化,
即先public int j=print("j");调用到print 打印:  1:j   i=0  n=0
然后执行实例代码块,即print("构造块"),
最后调用构造函数Test1("t1");分别打印:2:构造块   i=1  n=1                 
                                                                      3:t1      i=2  n=2
打印结果的4-6行是 Test1 t2=new Test1("t2");执行的结果。 同上。
然后是: public static int i=print("i");   打印:7:i   i=6  n=6
然后是静态块:static{     print("静态块");    }        打印:8:静态块   i=7  n=99

最后9-11是主函数中的语句了  和1、2、3行打印一个道理。不过要注意此时n的值。
断网前最后的挣扎。 我只能帮你到这儿了。{:3_64:}







评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
看晕了 不过肯定是静态代码快,然后构造代码块,再到构造函数,的
回复 使用道具 举报
伍叶竹 发表于 2014-4-27 23:33
好复杂的题,捣鼓了好久一点想法:装载Test1.class,静态变量在类编译时全部初始化,非静态变量仅在实例化 ...

谢谢啊,我再好好悟悟
回复 使用道具 举报
  好乱啊   不过打上断电 很清晰的哦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马