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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 森仔 中级黑马   /  2012-11-21 23:43  /  2339 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 森仔 于 2012-11-24 08:44 编辑

回答别人的帖子竟把自己给绕进去了 ,求高人!!!!、
为何它能编译通过,
int a = 5;
int b=0;
if(a > 3)
{
b = 2;
}

System.out.println(b);

而它就不行了呢!!
int a = 5;
int b;
if(a > 3)
{
b = 2;
}

System.out.println(b);

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

7 个回复

倒序浏览
int a = 5;
int b=0;
if(a > 3)
{
b = 2;
}

System.out.println(b);

这个行,因为你初始化y了啊!!

int a = 5;
int b;
if(a > 3)
{
b = 2;
}

System.out.println(b);
这个不行,是因为你没有初始化变量啊!

回复 使用道具 举报
张权 发表于 2012-11-21 23:46
int a = 5;
int b=0;
if(a > 3)

哥们,这明明是“b”啊! 还有定义变量的时候不一定非要初始化啊 默认的int型变量初始化值为0的

点评

因为你定义的b是局部变量,必须显示初始化,否则是不能用的  发表于 2012-11-22 07:49
回复 使用道具 举报
我想是这样的,如果这个b是作为一个类的属性值声明,大可没事的,但是
如果b在一个方法或者是静态方法中,都要进行初始化的,基本数据类型可以是0什么的,但不可以什么都没有,同样对象也一样,可以赋null,但不可以什么都没有
回复 使用道具 举报
这里需要区分一下两段代码中if语句的功能:
第一段代码,if语句实际上是先要对b进行值的改变,也就是b本身已经初始化过了,在满足一定条件的时候进行值的改变!无论是否改变成功,都不影响最后输出语句的执行!所以编译没有问题!

第二段代码,if语句的功能实际上进行的是对b有条件的初始化,满足条件则初始化b,不满足则不初始化,而b初始化了就可以输出,没有初始化就不能输出!所以if语句的是否执行导致输出语句可能无法执行!所以就报错,编译不能通过!

点评

编译器是严格按照语法来执行编译检查的,与if没关系了,定义的局部变量必须先初始化,没有初始化使用的时候就报错吧,这是我的理解  发表于 2012-11-22 07:50
回复 使用道具 举报
这个是因为b是局部变量,而局部变量要初始化才能够使用的,什么是局部变量呢,最简单的办法就是写在方法内的都是局部变量,在定义的时候一定要先初始化就是给个值。如果你这个变量定义在方法体个,那就是成员变量了,这就不用初始化
回复 使用道具 举报
  int a = 5;
  int b=0;
  if(a > 3)
  {
  b = 2;
  }
  System.out.println(b);
这个之所以能编译通过,是因为你对b进行了初始化动作,所以它能编译通过

  int a = 5;
  int b;
  if(a > 3)
  {
  b = 2;
  }
  System.out.println(b);
而这个你没有对b进行初始化就去使用它,肯定会报错,这个是基础问题,一定要细心
回复 使用道具 举报
本帖最后由 倪鹏博 于 2012-11-23 02:23 编辑
倪鹏博 发表于 2012-11-22 00:45
这里需要区分一下两段代码中if语句的功能:
第一段代码,if语句实际上是先要对b进行值的改变,也就是b本身 ...

我这里其实是从人的角度去理解这个编译过程的!我认为这样理解编译器比较容易一点!
如果从编译器的角度来看的话,确实跟if没关系!只要保证变量用之前一定初始化过就行!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马