黑马程序员技术交流社区
标题:
有关初始化的问题。
[打印本页]
作者:
丘凤光
时间:
2013-3-18 19:44
标题:
有关初始化的问题。
本帖最后由 丘凤光 于 2013-3-18 20:55 编辑
刚才逛论坛是看别人的一段代码,忽然想到一个自己平时不太在意的地方,简化的代码如下
class A
{
public static void main(String[] args)
{
int i;
int t=4,p=6;
while(t<p)
{
i=5;
t++;
}
System.out.println(i);
}
}
复制代码
编译时提示i为初始化。疑问:为什么变量不能在循环体里初始化?平时像这样需要注意的地方还有哪些呢?
希望大神帮忙指点指点。
作者:
张洪慊
时间:
2013-3-18 20:02
注意:报的错误是 可能 尚未初始化变量i
我的理解是:
t,p虽然赋了值,但 t,p为变量(我可能随时改变t,p值)->while循环体中的内容可能执行不到->输出未知的i
你把输出语句放在循环体里面->要么执行循环体,i一定有值->不执行,那也不输出i
作者:
李尧
时间:
2013-3-18 20:13
因为编译器是检查语法问题,你的while条件t<p,对编译器来说它是不知道到底是false还是true的,那么如果while内的语句没被执行,i变量就没有初始化.
作者:
HM张超
时间:
2013-3-18 20:20
作用域的问题你要好好比对你自己的逻辑,
你可以这让认为,认为程序中代码不一定会走赋值的代码那块,所以它不能让你这么干!
这样就类似于if ,你写很多if 但是实际上用得上的有有几个呢?
希望对你有帮助!
作者:
何仕映
时间:
2013-3-18 20:36
本帖最后由 何仕映 于 2013-3-18 20:38 编辑
这个就要想到jvm对堆内存和栈内存中变量的处理了。
因为这你定义的这个变量是在
盏内存
中,在栈内存中的变量,jvm是不会给它默认初始化的。必须在建立的时候就初始化一个值。
在
堆内存
中时,就不一样。比如Person 的年龄属性int age,在建立的时候jvm会先给它默认初始化。int类型为0;
总之,在盏内存中在建立时必须显式初始化。
作者:
伍淑江
时间:
2013-3-18 20:41
class A
{
public static void main(String[] args)
{
int i;
//注意: int i; 是局部变量
int t=4,p=6;
while(t<p)
{
i=5;
t++;
}
System.out.println(i);
}
}
在一个类中,如果是成员变量,在声明好之后,就会给它一个默认值的初始值。
但局部变量必须要手动初始化。
你可以先赋一个int i=0;
作者:
孙晋学
时间:
2013-3-18 20:44
局部变量在定义的时候就要初始化,指的是i。
程序在执行到 int i;时,会在栈中创建一个4个字节的内存区域用于存贮整形的值。
因为你为指定它的值,那这4个字节所存放的东西是未知的,就可能出现不可预知的错误。
Java在编译阶段指出这个错误,是为了避免以后出现问题
作者:
黑马-王鹏
时间:
2013-3-18 20:54
定义局部变量的两个要素,变量名和初始化值,否则jvm不能识别,会报错
因为i在局部变量中定义时,必须初始化,
作者:
丘凤光
时间:
2013-3-18 20:55
刚才改了一下代码
class A
{
public static void main(String[] args)
{
int i;
while(true)
{
i=5;
break;
}
System.out.println(i);
}
}
复制代码
可以看出确实是因为循环体里的赋值语句i=5有可能执行不到所以编译报错。
从内存上解析更深刻。都谢谢大家啊。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2