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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴振良 黑马帝   /  2012-3-9 18:54  /  3740 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. class Test
  2. {
  3.         public static void main(String args [])
  4.         {
  5.                 int a;
  6.                 a=1;
  7.                 System.out.println(a);
  8.                 Test t=new Test();
  9.                 System.out.println(t.aa());
  10.         }
  11.         public int aa()
  12.         {
  13.                 int b;
  14.                 b=2;
  15.                 return b;
  16.         }
  17. }
复制代码
这代码运行是正常的输出1和2,以好像教程里说好像局变量在定义时必须进行初始化,否则会报错。这里说的“在定义时必须进行初始化”应该是:int a=1;这种形式吧,如果是的话为什么上面的代码没有报错?

点评

学习了  发表于 2012-4-11 09:10

10 个回复

倒序浏览
你把初始化分两部,第一部是定义变量,第二步是赋初始值。你把两句分开来,连续写着,这样实际上跟初始化没区别,不过多线程环境中可能会产生问题。

我估计他这句话的真正意思是在变量被使用前,必须要进行赋值。
回复 使用道具 举报
报错是因为执行的时候发现a没有值,所以报错,并不是语法上要求必须有一句初始化的句子,初始化的要求只是从代码安全考虑的,
成员变量会被自动默认初始化,而局部变量不会自动初始化,所以就会有未初始化的无意义的值去参与计算的情况,为了避免这种错误,所以认为的要求局部初始化。
你可以试试去掉a=1,看是不是编译仍然通过,通过就说明这不是语法要求,如果你后面的代码不使用这个变量,那么即使运行也不会有任何问题。
我试验过了。
回复 使用道具 举报
本帖最后由 黄方 于 2012-3-9 19:26 编辑

额,看了你的问题啦,你的确是把两句分开来写的啦!这样和初始化没区别的啦,
在类中定义的成员变量如果你没有初始化java会自动帮你初始化,如果是数字会自动初始化成0,字符会初始化成'o',对象引用会初始化成null.

当然如果你定义的是局部变量就必须初始化了,否则编译会报错

这正是java的特点,极大的提高了代码安全性
回复 使用道具 举报
许圣建 发表于 2012-3-9 19:07
报错是因为执行的时候发现a没有值,所以报错,并不是语法上要求必须有一句初始化的句子,初始化的要求只是 ...

嗯,你这个我也试了,定义一个a并不赋值,也不使用它,最后是不报错的,那么说明“定义局部变量时必须初始化”这就有点点的不对了,是吧
回复 使用道具 举报
其实我认为应该是使用时一定要初始化才对,因为局部变量保存在栈内存中,而栈内存是不会给变量默认初始值的,所以使用的时候一定要初始化,但是不使用的时候,它只是放在那里,所以不会报错
回复 使用道具 举报
  局部变量在内存中是存放在栈内存的,而栈内存的特点是 调用完就会自动清除,并不像堆内存会给赋值。当你在方法中创建一个局部变量的时候
虚拟机就把它存放在栈内存中,你如果调用它的话他必须得有值,你想想如果没值的话,你调用的是一个变量也没什么意义。所以java规定的局部变量
必须给其初始化,而初始化有两种,一种是 int a=1; 一种是int a; a=1;  
回复 使用道具 举报
许圣建 发表于 2012-3-9 19:07
报错是因为执行的时候发现a没有值,所以报错,并不是语法上要求必须有一句初始化的句子,初始化的要求只是 ...

嗯,你这个我也试了,定义一个a并不赋值,也不使用它,最后是不报错的,那么说明“定义局部变量时必须初始化”这就有点点的不对了,是吧

这就是主观安全控制、客观安全控制的问题了,没有泛型的时候,你还不是要注意别喝醉了进行错误的classcast,语言只是语言,并不是说不发生语法错误就不会有安全隐患。
回复 使用道具 举报
你那个也相当于给变量初始化,成员变量(类的属性)有默认初始化值,而方法中的变量(局部变量)是没有默认初始化值得,所以必须初始化。你是不是没有保存,所以才不会报错
回复 使用道具 举报
王利强 发表于 2012-3-10 18:13
你那个也相当于给变量初始化,成员变量(类的属性)有默认初始化值,而方法中的变量(局部变量)是没有默认 ...


请看我5楼的回答,我已经编译了并且都运行类了,一样不报错的!
可能是我理解的“初始化”不太正确吧,像你们这么说的话:
int a;
……//此处省略20句代码
a=5;

像这样中间隔了好多代码才赋值是不是也叫初始化呀?
回复 使用道具 举报
没人理我了{:soso__187047450382421961_3:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马