黑马程序员技术交流社区

标题: 关于boolean的问题 [打印本页]

作者: wyqs92    时间: 2014-4-22 13:26
标题: 关于boolean的问题
本帖最后由 wyqs92 于 2014-4-22 14:15 编辑

为什么这样定义boolean是错的
  1. public class sssa {

  2.         public static void main(String[] args) {
  3.                 boolean flag ;
  4.                 if(flag)
  5.                         System.out.println("nihao");

  6.         }
  7. [code]
  8. 而这样却可以。。
  9. [code]public class sssa {

  10.         public static void main(String[] args) {
  11.                
  12.                 fl f=new fl();
  13.                 if(f.flag){
  14.                         System.out.println("nihao");
  15.                 }

  16.         }

  17. }
  18. class fl{
  19.         boolean flag;
  20. }
复制代码

作者: a3330682    时间: 2014-4-22 13:34
上面你没给他初始化值;而下面你new对象时已经默认初始化了;
作者: wyqs92    时间: 2014-4-22 13:44
a3330682 发表于 2014-4-22 13:34
上面你没给他初始化值;而下面你new对象时已经默认初始化了;

意思就是说如果boolean 变量是在某个类中的话,只要一创建对象,此boolean变量就会初始化,初始化的值为false吗?
作者: 世界公民    时间: 2014-4-22 13:45
上面的代码中boolean flag ;定义在了方法中,所以是局部变量,而且你要知道在Java中局部变量是不会默认初始化的,而在下面的代码中boolean flag 你写在了一个类中flag就成了类的变量,当创建类的实例对象时类的变量是会自动初始化的。。。。不要问为什么,因为我也不知道。
作者: wyqs92    时间: 2014-4-22 13:51
a3330682 发表于 2014-4-22 13:34
上面你没给他初始化值;而下面你new对象时已经默认初始化了;

那为什么上面不可以默认初始化值了?
作者: tacyjay在路上    时间: 2014-4-22 13:55
本帖最后由 tacyjay在路上 于 2014-4-22 13:59 编辑

首先运行了一下你第一个代码,已经将错误和建议写在代码中。
  1. public class FlagDemo1//建议:类名要有意义,且要符合规范
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 boolean flag ;
  6.                 if(flag)
  7.                 System.out.println("nihao");
  8.         }//错误:这儿漏写了括号
  9. }
复制代码


编译结果如下:

说明:
boolean 的默认初始化值为false,但是在方法体中,作为的是局部变量,不会自动赋值,所以编译后,提示要初始化变量。
事实上,boolean要有默认值的话,必须声明为 静态变量或者成员变量。

总结一下,就是成员变量可以不显式初始化,由系统设定默认值;局部变量没有默认值,所以必须设定初始赋值

所以你的第2个代码。

  1. public class FlagDemo2
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Flag f=new Flag();
  6.                 if(f.flag)//if判断为false,不执行输出语句
  7.                 {
  8.                         System.out.println("nihao");
  9.                 }
  10.         }
  11. }

  12. class Flag
  13. {
  14.         boolean flag;//flag没有定义在方法体中,作为类Flag的成员变量,有默认值fause
  15. }
复制代码


另外,强烈建议,楼主写代码要养成一个好的习惯,建议写在代码里了,这样也容易帮助发现错误。
作者: wyqs92    时间: 2014-4-22 14:12
tacyjay在路上 发表于 2014-4-22 13:55
首先运行了一下你第一个代码,已经将错误和建议写在代码中。

谢谢!!已经想明白了!!是成员变量和局部变量的初始化值问题。。。
作者: wyqs92    时间: 2014-4-22 14:13
世界公民 发表于 2014-4-22 13:45
上面的代码中boolean flag ;定义在了方法中,所以是局部变量,而且你要知道在Java中局部变量是不会默认初始 ...

谢谢!!已经想明白了!!是成员变量和局部变量的初始化值问题。。。
作者: fatlv123456    时间: 2014-4-22 22:15
初始化的问题,一开始定义的基本类型,没有初始化的话赋值为NULL,下面的是用类,类实例化的时候boolean自动赋值为false
作者: 爱翚    时间: 2014-4-22 22:50
public class sssa {
    public static void main(String[] args) {
            //这个值是在栈内存中的,没有初始化的话是没有值的
        boolean flag;
        if(flag){
                System.out.println("nihao");
        }
           
            fl f=new fl();
            //这个值是false,因为通过NEW方法在堆内存中实例化了一个实体对象,而堆内存中是有默认值的
            //boolean型的默认值是false
        if(f.flag){
                System.out.println("nihao");
        }
    }
}
class fl{
    boolean flag;
}




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