15

我刚开始学习Java。在我关注的在线课程中,我被要求尝试以下代码:

String email1 = "meme@me.coh";
String email2 = "meme@me.com";
Boolean isMatch = false;

isMatch = email1.equals (email2);

if (isMatch == true){
    System.out.println("Emails match");
}
else{
    System.out.println("Emails don't match");
}

我不明白为什么isMatch在下一行我比较电子邮件地址并将值分配给时,我被要求声明为假isMatch
我已经尝试过以下代码,它似乎工作起来是一样的:

String email1 = "meme@me.coh";
String email2 = "meme@me.com";
Boolean isMatch;

isMatch = email1.equals (email2);

if (isMatch == true){
    System.out.println("Emails match");
}
else{
    System.out.println("Emails don't match");
}

在课程中,它没有解释为什么我isMatch首先宣布为假。isMatch在比较电子邮件地址之前,我是否有理由必须声明为假?

4

6 回答 6

17

不仅不需要先声明它false,我还要添加一些其他改进:

  • 使用boolean代替Boolean(也可以是null无缘无故的)

  • 在声明期间分配:

    boolean isMatch = email1.equals(email2);
    
  • ...final如果可以的话,使用关键字:

    final boolean isMatch = email1.equals(email2);
    

最后但并非最不重要的:

if (isMatch == true)

可以表示为:

if (isMatch)

这使得该isMatch标志没有那么有用,内联它可能不会损害可读性。我建议在那里寻找一些更好的课程/教程......

于 2012-10-20T19:45:51.087 回答
9

您不必这样做,但有些人喜欢显式初始化所有变量(我也这样做)。尤其是那些使用多种语言编程的人,更容易拥有始终初始化变量的规则,而不是逐个案例/逐个语言地决定。

例如,Java 具有 Boolean、int 等的默认值。另一方面,C 不会自动给出初始值,除非您自己明确分配值,否则内存中发生的任何事情都是您最终得到的。

正如您所发现的,在上述情况下,代码在没有初始化的情况下也能正常工作,尤其是因为变量设置在下一行,这使得它显得特别多余。有时您可以结合这两行(声明和初始化——如其他一些帖子中所示)并充分利用这两种方法,即使用email1.equals (email2);操作结果初始化变量。

于 2012-10-20T19:44:52.010 回答
2

没有理由这样做。事实上,我会选择将声明和初始化结合起来,如

final Boolean isMatch = email1.equals (email2);

使用final关键字,因此您以后也不能(意外地)更改它。

于 2012-10-20T19:45:50.033 回答
1

首先,你不应该使用它们。您正在使用wrapper类型,如果您有原始类型,则很少使用该类型。所以,你应该使用boolean相当。

此外,我们将boolean变量初始化false为保存初始默认值,即 false。如果您已将其声明为实例变量,它将自动初始化为false.

但是,无论您是否分配默认值,这完全取决于您。我宁愿在声明时初始化它们。

但是如果你是立即给你的变量赋值,那么你可以直接给它赋值,而不必定义一个default值。

所以,在你的情况下,我会这样使用它: -

boolean isMatch = email1.equals (email2);
于 2012-10-20T19:46:09.777 回答
1

在您的示例中,您不需要。作为标准的编程实践,所有变量都在某个代码块内被引用,例如try{} catch(){},并且在块外被引用,您需要首先在 try 块之外声明变量,例如

当您的 equals 方法调用引发一些异常时,这很有帮助,例如NullPointerException

     boolean isMatch = false;

     try{
         isMatch = email1.equals (email2);
      }catch(NullPointerException npe){
         .....
      }
      System.out.print("Match=="+isMatch);
      if(isMatch){
        ......
      }
于 2012-10-20T19:52:00.290 回答
0

正如 Levon 所说,这不是文档中所述的强制性要求:http: //docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

这可能是其他不保证原始数据类型默认值的语言的习惯。

于 2012-10-20T19:46:18.607 回答