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

Java 为什么我们不能在if语句中声明变量?,java,Java,我知道在堆栈溢出上有这样一个问题,但我想知道为什么我们不能在if语句中声明变量,这样我们就可以通过使用if范围来节省空间 例如,如果我写: if (int i) { ... } 那么我只能在if范围内使用I,但是如果我在if语句之外写入I,那么I变量应该在整个块的内存中。if语句是一个测试,因此在if中声明变量没有任何意义 想想看,如果是这样的话: if(a == 1){ // blan } System.out.println("Hello World!"); //use a

我知道在堆栈溢出上有这样一个问题,但我想知道为什么我们不能在if语句中声明变量,这样我们就可以通过使用if范围来节省空间

例如,如果我写:

if (int i) {
    ...
} 

那么我只能在if范围内使用I,但是如果我在if语句之外写入I,那么I变量应该在整个块的内存中。

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

想想看,如果是这样的话:

if(a == 1){
  // blan
}
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
如果在If条件中声明a,则实际上是比较两个静态值

许多语言允许您在for循环中声明迭代器VARABLE:

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

// a is out of scope here
如果int i=>int i不是一个布尔表达式,那么这将不起作用

if ( booleanExpr ){
  int a = 5;
...
}
这里a是if块中的局部变量。在if块的末尾,它将从堆栈中移除,并且变得不可用

int a = 5;
if ( booleanExpr){
  ...
}
这里,a不是if块的局部,而是包含方法的局部。因此,在方法从声明开始的整个执行过程中,它将位于堆栈上

a也可以是类的实例或静态变量,那么它在类的每个方法中都是可访问的。不过,实例变量在静态上下文中是不可访问的

为什么语言不能支持它

这个问题问错了。真正的问题是:

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

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


在这种情况下,没有。在少数情况下,它可能很方便,但它不是该语言的核心功能,也不是真正必要的。因此,没有令人信服的理由使该语言的实现更加复杂,并且在现在和将来都会产生巨大的成本来支持它。

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

if(a == 1){
  // blan
}
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
为什么我们不能在if语句中声明变量

因为政府不允许这样做

如果我写ifint I{},那么我只能对作用域

可以使用块

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);
}

但这会降低代码的可读性。因此,我建议不要使用它。

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


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

你不能这样做,因为语言不支持它。还是我遗漏了什么?因为它不支持它。这就像问为什么汽车不能飞一样。另外,您的示例用法是胡说八道的。该语言不支持它,因为这是一个糟糕的想法。考虑你的例子,如果INT我评估为真还是假?为什么要这么做?你对内存的担心也是不成立的。0{}所以我只表示if作用域在这个示例中,您可以只编写ifmethod=如果不需要if分支后面的值,则为0