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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fiend 中级黑马   /  2012-7-28 10:41  /  2432 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 fiend 于 2012-7-28 11:26 编辑

for (int i = 0; i < 10; i++)
   Test t = new Test();
为什么这样写不行?不是当只有一条语句的时候可以省略花括号吗?
怎么现在却不行了呢?谁能帮我解释一下?谢谢。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

10 个回复

正序浏览
{:soso_e102:}
回复 使用道具 举报
本帖最后由 魏-玉-彪 于 2012-7-28 19:34 编辑

for (int i = 0; i < 10; i++)
   Test t = new Test();

等价于

   Test t = new Test();
   Test t = new Test();
   Test t = new Test();
   Test t = new Test();
   Test t = new Test();
   Test t = new Test();
   Test t = new Test();
   Test t = new Test();
   Test t = new Test();

估计你的意思是

for (int i = 0; i < 10; i++)
   Test ti = new Test();
     这样就不是重复  Test t = new Test();了

而是等价于

   Test t 1= new Test();
   Test t2 = new Test();
   Test t 3= new Test();
   Test t 4= new Test();
   Test t 5= new Test();
   Test t 6= new Test();
   Test t7 = new Test();
   Test t8 = new Test();
   Test t9= new Test();




回复 使用道具 举报
fiend 中级黑马 2012-7-28 11:25:36
9#
杨志 发表于 2012-7-28 10:55
这个问题在于重复定义了t;
每次循环开始你都会去执行
Test t ;

谢谢,分析得蛮到位的。
回复 使用道具 举报
韦念欣 黑马帝 2012-7-28 11:09:04
8#
杨志 发表于 2012-7-28 10:59
你去测试过了么?能运行?会直接报错的!

还是这位兄弟分析的到位,学习了!
回复 使用道具 举报
杨志 高级黑马 2012-7-28 10:59:32
7#
韦念欣 发表于 2012-7-28 10:49
当然可以这样写,但是这个t被new出来之后就变成垃圾了。没什么意义。


你去测试过了么?能运行?会直接报错的!
回复 使用道具 举报
本帖最后由 杨志 于 2012-7-28 10:57 编辑

这个问题在于重复定义了t;
每次循环开始你都会去执行
Test t ;
那么就等于是定义了10次。

  1. Person t = null;
  2. for (int i = 0; i < 10; i++)
  3.       t = new Person("tt");
复制代码
这样就不会有问题了。这样的话就是说每次去建立对象都赋值给t引用。那么t最后表示的对象将是最后new的一个对象。
建议要new 10个对象的话,就用数组做,或者用集合!这样的建立方式,最后只会有一个对象,而其他的都会被回收掉!
其实当你第一次新建对象的时候。栈区就已经申明了一个t的引用用来保存一个Person对象。
那么在你后面的循环当中,又来申明t引用。这样肯定是不对的。
就好比下面的代码。

  1. int a = 6;
  2. int a = 7;
复制代码
重复定义两个int型的a变量。这样也不行的。因为第一个定义的时候栈区就已经存在了。
但是这样却是可以的。
  1. int a = 6;
  2. a = 7;
复制代码
这样只是去修改栈区的值。而不是又去申明一个a。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这样循环new出来之后,你new了10个名字叫t的对象,没有意义了
回复 使用道具 举报
当然可以这样写,但是这个t被new出来之后就变成垃圾了。没什么意义。
回复 使用道具 举报
  1. for (int i = 0; i < 10; i++)
  2.    Test t = new Test();
  3. 这个当然不行,你想循环对象,可是对象是不能够同名的,你以为是克隆吗?
复制代码
回复 使用道具 举报
对象名字总不能都是t吧...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马