为什么我们不能在if语句中声明变量?

时间:2015-06-29 13:34:43

标签: java

我知道Stack Overflow上有这样的问题,但我想知道为什么我们不能在if语句中声明变量,以便我们可以通过仅使用if范围来节省空间

例如,如果我写:

if (int i) {
    ...
} 

然后我只能在i范围内使用if,但如果我在if语句之外写,那么i变量应该在内存中整块。

6 个答案:

答案 0 :(得分:3)

if ( int i ) => int i不是布尔表达式,因此无法工作。

if ( booleanExpr ){
  int a = 5;
...
}

这里a是if块中的局部变量。在if-block的末尾,它将从堆栈中删除并变得无法使用。

int a = 5;
if ( booleanExpr){
  ...
}

这里a不是if块的本地,而是包含方法。因此,它将在整个方法执行期间(从其声明开始)在堆栈中。

a也可以是类的实例或静态变量,然后它可以在类的每个方法中访问(但实例变量在静态上下文中是不可访问的)

答案 1 :(得分:3)

  

为什么我们不能在if语句中声明变量?

因为Java Language Specification不允许它。

  

如果我写if(int i){},那么我只能将i用于if范围

您可以使用块

public void someMethod(){
   {
      int i = 1; // visible only to the current block
   }
   {
      int i = 0; // visible only to the current block
      if(i == 0){
        System.out.println("i = " + i);
      }
   }

   // compiler error, because i is not visible outside the block
   System.out.println(i);
}

但这降低了代码的可读性。所以我建议不要使用它。

答案 2 :(得分:2)

if语句是一个测试,因此在if中声明变量没有任何意义。

想一想,if是这样的事情:

if(a == 1){
  // blan
}

如果在if条件中声明a,则实际上是在比较2个静态值。

许多语言允许你声明一个"迭代器"可以在for循环中使用:

if(int a = 0 ; a < somelist.length ; a++){
  // Do something
}

// a is out of scope here

答案 3 :(得分:0)

  

为什么语言不能支持

这是一个错误的问题。真正的问题是:

  

该语言是否有令人信服的理由支持它?

也就是说,有没有令人信服的理由来实现它,对所有可能的边缘情况进行详尽的测试,并在该语言的所有未来版本中进行维护?

在这种情况下,没有。没有。它可能在少数情况下很方便,但它不是语言的核心功能,并不是真正必要的。因此,没有令人信服的理由使语言的实施变得更加复杂,并且现在和未来都需要付出巨大的代价来支持它。

答案 4 :(得分:0)

您可以限制变量的范围,使其仅在if语句中可见,如下所示:

System.out.println("Hello World!");
//use a codeblock to restrict access
{
  int i = 4;
  if(i!=0)
  {
    System.out.println("i = "+i);// this is OK
  }
}
System.out.println("i = "+i);//this is not OK

答案 5 :(得分:0)

如果是条件的,并且在条件内声明变量时没有有效的用例。

如果你的条件更复杂,你可以为它实现一些方法,在这些方法中你可以使用那些变量,但是,如果你需要在if之外的那个变量,那么在if在正确的范围之外定义它。