免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10368 | 回复: 6
打印 上一主题 下一主题

求这段代码的运行结果和运行原理,看不太懂 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-23 09:27 |只看该作者 |倒序浏览
  1. public class Test1 {
  2.         public static int k=0;
  3.         public static  Test1 t1=new Test1("t1");
  4.         public static  Test1 t2=new Test1("t2");
  5.         public static int i=print("i");
  6.         public static int n=99;
  7.         public int j=print("j");
  8.         {
  9.                 print("构造块");
  10.         }
  11.         static{
  12.                 print("静态块");
  13.         }
  14.         public Test1(String str){
  15.                 System.out.println((++k)+":"+str+"   i="+i+"  n="+n);
  16.                 ++i;
  17.                 ++n;
  18.         }
  19.         public static int print(String str){
  20.                 System.out.println((++k)+":"+str+"   i="+i+"  n="+n);
  21.                 ++n;
  22.                 return ++i;
  23.         }
  24.         public static void main(String[] args) {
  25.                 Test1 t=new Test1("init");
  26.         }
  27. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2013-09-23 18:38 |只看该作者
居然没一个人回复。。。

论坛徽章:
0
3 [报告]
发表于 2013-09-25 11:00 |只看该作者
自顶!

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
4 [报告]
发表于 2013-09-25 21:53 |只看该作者
这里说的是构造函数\变量初始化和静态块的关系,你可以看java思想这本书
不过你这题好绕啊...
关键是搞清楚,变量初始化和静态快组合成静态快的规则,其他他们是按书写的规则顺序而下的
所以你上面的代码整理下,等价下面的代码:
  1. public class Test1 {

  2.     public static int i;
  3.     public static int k;
  4.     public static int n;
  5.     public static int t1;
  6.     public static int t2;

  7.     static {
  8.         k = 0;
  9.         t1 = new Test1("t1");
  10.         t2 = new Test1("t2");
  11.         i = print("i");
  12.         n = 99;
  13.         print("静态块");
  14.     }
  15.    
  16.     public Test1(String str){
  17.             j = print("j");
  18.             print("构造块");
  19.             System.out.println((++k)+":"+str+"   i="+i+"  n="+n);
  20.             ++i;
  21.             ++n;
  22.     }
  23.     public static int print(String str){
  24.             System.out.println((++k)+":"+str+"   i="+i+"  n="+n);
  25.             ++n;
  26.             return ++i;
  27.     }
  28.     public static void main(String[] args) {
  29.             Test1 t=new Test1("init");
  30.     }
  31. }
复制代码
至于结果我就不猜了.里面还涉及参数默认值的问题

论坛徽章:
0
5 [报告]
发表于 2013-09-26 20:59 |只看该作者
回复 4# rover12421
运行结果是
  1. 1:j   i=0  n=0
  2. 2:构造块   i=1  n=1
  3. 3:t1   i=2  n=2
  4. 4:j   i=3  n=3
  5. 5:构造块   i=4  n=4
  6. 6:t2   i=5  n=5
  7. 7:i   i=6  n=6
  8. 8:静态块   i=7  n=99
  9. 9:j   i=8  n=100
  10. 10:构造块   i=9  n=101
  11. 11:init   i=10  n=102
复制代码
不懂。。。

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
6 [报告]
发表于 2013-09-26 23:33 |只看该作者
回复 5# laoliuya

等价代码其实已经差不多能说明了.
下面我话个图再简单说下吧


   
第一次new Test,会进入static块,以后都不会进入了,所以main中new Test("init")是先执行static中的代码(红色框框里的)再回到new Test(String str)执行.大步骤就是两步.1-->6
其中1我又划分了2-->3-->4-->5,四个步骤.

先说下n,第一次使用n,是是从2进入到Test1方法,再进入print("j"),这个时候n只声明了,并没赋值,所以他的默认值是0.也就是一次打印是n的值为0.
然后在执行完2-->3之后,在第4步设置成了99.所以从这个时候开始,n才从99开始,也就是下一次的print("静态块")里的n是99

其他的感觉没啥要说的了.

论坛徽章:
0
7 [报告]
发表于 2013-09-27 16:13 |只看该作者
回复 6# rover12421


    看了半天,终于看明白了,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP