黑马程序员技术交流社区

标题: 这个怎么回事? [打印本页]

作者: 刘琦    时间: 2013-3-13 14:43
标题: 这个怎么回事?
本帖最后由 刘琦 于 2013-3-13 20:35 编辑

int i =0;
for (j=0;j<10;j++){
  i=i+j;

}
System.out.println("i="+i+"j="+j);
这个程序里面j无法输出,是因为j只在循环体内有效,那为什么i就可以输出呢?而且是计算后的结果,无法j都无法从循环内跳出返回数据,为什么i就可以返回计算的结构,而不是外面的初始化0呢?这个i和j到底是怎么存储呢?
作者: 曾钦    时间: 2013-3-13 14:54
j是循环内的局部变量,生命周期在循环内,出了循环就挂了。java在打印的时候都不认识 j
目测这代码编译都通不过。。
作者: HM王琦    时间: 2013-3-13 15:00
int i =0;
int (j=0;j<10;j++){  //确定你这里没有什么问题吗?应该是for(int j=0;j<10;j++)
  i=i+j;

}
System.out.println("i="+i+"j="+j);//j是在for循环的局部,属于局部变量,如果你打印System.out.println(j);是打印不出来的,因为j无法访问。
你说i能输出,这里也是不行的。编译都不能通过
作者: 樊其杰    时间: 2013-3-13 15:01
楼主你上面程序 是不是应该是for (j=0;j<10;j++), j是循环体内的局部变量,System.out.println("i="+i+"j="+j);这句根本编译通不过,如果想要得到j 的值 ,可以将j定义为全局变量:
  1.         int i =0;
  2.         int j;
  3.         for (j=0;j<10;j++){
  4.           i=i+j;
  5.         }
  6.         System.out.println("i="+i+"j"+j);
  7.     }
复制代码

作者: HM张超    时间: 2013-3-13 15:06
楼上正解,不说代码问题,作用域的理解也有问题!
作者: 黑马17期-闫东东    时间: 2013-3-13 15:43
int i =0;
for(int j=0;j<10;j++)
{  
  i=i+j;
}
System.out.println("i="+i+"j="+j);//报错Unresolved compilation problem: j cannot be resolved to a variable

        }
J是局部变量,在循环内有效,出循环,就不存在了,  i是个成员变量,打印i=45
作者: 张雪萍    时间: 2013-3-13 16:28
[code]int i =0;
for(int j=0;j<10;j++)
{  
  i=i+j;
}
System.out.println("i="+i+"j="+j);[code]
要注意变量的种类,i是一个全局变量,他的生命周期随着函数的小时而消失,
j是局部变量,只在这个for循环中分配内存,一旦循环结束,随之相应内存也会消失。所以运行到最后的打印时,j已经在内存中没有了,所以最后也没有结果了
作者: 石伟    时间: 2013-3-13 16:34
     

         int i =0;

        for (int j=0;j<10;j++)
        {

                 i=i+j;

        }

        System.out.println("i="+i+"j"+j);

打印不出来j,编译会出错,因为j是局部变量!
为什么能打印出来i,因为i是全局变量,经过for循环之后,i的值变成了45,必须没问题


如果想打印j,只能把j定义为全局变量,或者在for循环内部打印j

作者: 樊玲    时间: 2013-3-13 16:35

int i =0;                       //i是成员变量。被放在堆里。如果栈指向对象的引用为null,系统会定时进行垃圾清理。
for (j=0;j<10;j++){     //这里j是局部变量。所谓局部变量,会放在栈内存中。随着方法,或者循环体执行完,就会释放。意思就是这里,for循环一结束,j就被释放了。没有                                
                               //了,所以后面是输出j是输出不来的。
  i=i+j;

}
System.out.println("i="+i+"j="+j);

希望可以帮到你。
作者: 沈子豪    时间: 2013-3-13 19:28

int i =0;
for(int j=0;j<10;j++)
{  
  i=i+j;
}
System.out.println("i="+i+"j="+j)
上面的i是成员变量,是存储在堆内存中的,而j是局部变量是存储在栈内存中的,最终的结果是无法编译的.两者的生命周期不同,成员变量的生命周期比局部变量长,在JAVA中对于这个局部变量的进入和弹出有专业的描述词为"进栈和弹栈",J在这个循环体中出来后就直接弹栈了被当做垃圾释放了,所以根本没办法找到J




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2