我知道Stack Overflow上有这样的问题,但我想知道为什么我们不能在if
语句中声明变量,以便我们可以通过仅使用if
范围来节省空间
例如,如果我写:
if (int i) {
...
}
然后我只能在i
范围内使用if
,但如果我在if
语句之外写,那么i
变量应该在内存中整块。
答案 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在正确的范围之外定义它。