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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 遗失的美好YXJ 于 2014-6-30 22:12 编辑

新人第一帖,求关照!今天老师上课说:int a = 10;int a = 15;这个语句不能通过编译,是因为a已经定义了,不能重复定义.
class Demo{        
public static void main(String[] args){                for (int x = 0;x<5 ;x++ ){                       
int i = 1;               
}      
}
}
为什么在for循环中i就是在重复定义,但是没有出错,如果把for循环展开成一般的语句不应该是
class Demo
{        
public static void main(String[] args)
int i = 1;                     
int i = 1;  
int i = 1;
int i = 1;
int i = 1;
}        
}
}
第二段编译肯定通不过,那么这两段程序有什么区别.感觉不像是作用域的问题,像是内存的问题.新人求罩,求解答.



17 个回复

倒序浏览
本帖最后由 496080891 于 2014-6-28 03:46 编辑
  1. /*在for循环中定义int i=1;一次循环完后,就会释放i在内存中的位置;
  2. 即在for循环中,当x=0时,i的值不管最后加到几,当x=1时,i的值又会变成初始值;
  3. 实验:*/
  4. for(int x=0;x<5;x++){
  5.     int i = 1;
  6.     i++;
  7.     System.out.print(i+" ");
  8. }
  9. //输出结果为:2 2 2 2 2
复制代码
回复 使用道具 举报
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
回复 使用道具 举报
for循环中定义的i的生命周期在这一次for循环结束后就结束了,在次循环时可以再定义一次i
回复 使用道具 举报
在for循环中每一次执行都会在栈空间开辟一个i的值,当for循环结束时i就会被释放,而写在一般语句中在堆空间里开辟了一个空间里面的值是1,并把1的地址传给了i,一般语句中重复定义i的值所以报错。我是这么理解的
回复 使用道具 举报
循环周期结束释放掉了
回复 使用道具 举报
引子 中级黑马 2014-6-28 11:49:36
7#
就是局部变量的生命周期问题   for循环中的i在for循环执行结束后就会结束生命周期  ,可以重复定义
回复 使用道具 举报
引子 发表于 2014-6-28 11:49
就是局部变量的生命周期问题   for循环中的i在for循环执行结束后就会结束生命周期  ,可以重复定义 ...

for循环中的i值是存放在栈内存内还是堆内存内?普通的定义i的语句呢?
回复 使用道具 举报
我是菜鸟,不过以我现在的理解来说,int a=10在申明变量的同时给它赋值了,他在内存中开辟了一个名字为a的空间,这个时候再int a=15,他首先要开辟一个名字为a的空间,但是前面已经有了a空间,变量名重复了,所以无法编译.
但是循环里的变量只有一个名字为i的空间,变量的值是可以改变的.
总结一下:楼主你把定义变量和给变量赋值混淆了,其实这是两个不同的步骤.
回复 使用道具 举报
KurtCobin 发表于 2014-6-28 22:59
我是菜鸟,不过以我现在的理解来说,int a=10在申明变量的同时给它赋值了,他在内存中开辟了一个名字为a的空间 ...

循环内也是在不断的定义int类型的i,而不是只定义了一次i,剩下的循环只是赋值.
应该是5,6,7楼说的那样,但是我想知道的是在这两种定义在内存里面是怎么存放的.
回复 使用道具 举报
涨姿势了!
回复 使用道具 举报
導ぷ仙″兲蕐 来自手机 中级黑马 2014-6-29 00:58:31
12#
变量定义只在大括号内起作用, 作用域问题来自: iPhone客户端
回复 使用道具 举报
遗失的美好YXJ 发表于 2014-6-28 22:00
for循环中的i值是存放在栈内存内还是堆内存内?普通的定义i的语句呢?

全部是栈内存啊  你没看视频吗   
回复 使用道具 举报
静丶 来自手机 中级黑马 2014-6-29 09:33:56
14#
学习学习~
回复 使用道具 举报
遗失的美好YXJ 发表于 2014-6-28 23:05
循环内也是在不断的定义int类型的i,而不是只定义了一次i,剩下的循环只是赋值.
应该是5,6,7楼说的那样,但 ...

没记错的话你看看第三天的视频,最后一节《数组概述-内存结构》,里面在讲到数组之前应该就有提过栈内存和堆内存的特点:

栈内存: 用于存放局部变量,像 int x =3;  char c = 'r' ; 这种语句里的“x,c”都是存放在栈内存里的;

堆内存:用于存放实体,所谓实体就是你使用关键字new 所创建出来的实体,包括数组或者是对象;

所以,楼上大大们的意思是,比如像这段代码:
public static void main(String[ ]  args)
{
    int x=1; // 主函数里面的 变量 X;

    for( int x= 3; x< 10; x++)
    {
        System.out.println(x);  // for 循环里面的变量X

        // int x = 4; 但如果你这样定义的话会编译出错,因为在初始化表达式里面已经定义过名为x 的变量了。
    }

}

---------------------------------------------------------

for循环里面的变量X 在循环的区间结束之后就会被释放,当循环第二次进行的时候才会重新创建。

回复 使用道具 举报 1 0
循环中的int i 和循环外的int i 虽然都是局部变量 但是作用域不同
在main方法中定义的int i 作用域是整个方法体
循环中的int i,作用域是一次循环,注意是“一次循环”
回复 使用道具 举报
这个 不是在栈内存中码?
回复 使用道具 举报
王小磊xiaolei 发表于 2014-6-29 11:27
循环中的int i 和循环外的int i 虽然都是局部变量 但是作用域不同
在main方法中定义的int i 作用域是整个 ...

嗯,for(步骤1;步骤2;步骤4){
         步骤3;
}
循环是在步骤3中(不是4,我试过了)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马