【问题标题】:Scoping rules in JavaJava中的范围规则
【发布时间】:2023-03-21 06:05:02
【问题描述】:

有人可以帮助我理解 Java 中的范围规则吗?这显然是无效的:

    {
        int i = 0;
        System.out.println(i); // fine, of course
    }
    System.out.println(i); // syntax error

i{} 中声明,在外部不可用。那么这个呢:

    for (int i = 0; i < 10; i++) {
         System.out.println(i); // fine, of course
    }
    System.out.println(i);  // syntax error, same as above.

我对这里的语法错误感到惊讶。 i 在外部范围内声明,但稍后不可用。它是否通过for 循环的一些特殊规则绑定到内部块范围?还有其他可能发生这种情况的情况吗?

【问题讨论】:

  • 任何其他关键字或语法产生关联的“裸”{}{}是有区别的——即必须在即使许多情况具有相似的语义,语法的上下文也是如此。

标签: java syntax braces


【解决方案1】:

想想 for 循环实际上是这样表示的:

{
  int i = 0;
  while (i < 10) {
    // your code
    i ++
  }
}

【讨论】:

【解决方案2】:

它是否通过一些特殊的 for 循环规则绑定到内部块范围?

是的,就是这样。

显然有局部变量声明:

class Some { 
   public void x( int i ) { 
    System.out.println( i ); // valid 
   }
   int j = i; // not valid 
}

另见:

来自语言规范。

【讨论】:

    【解决方案3】:

    这是 Java 中 for 循环的定义行为。

    class ForDemo {
         public static void main(String[] args){
              for(int i=1; i<11; i++){
                   System.out.println("Count is: " + i);
              }
         }
    }
    

    注意代码如何声明一个 初始化中的变量 表达。此变量的范围 从它的声明延伸到 由 for 管理的块的末端 声明,所以它可以用在 终止和增量表达式 也是。如果控制的变量 外部不需要 for 语句 在循环中,最好声明 初始化变量 表达。名称 i、j 和 k 是 常用于控制for循环; 在 初始化表达式限制了它们 寿命并减少错误。

    来源:http://download.oracle.com/javase/tutorial/java/nutsandbolts/for.html

    【讨论】:

      猜你喜欢
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      相关资源
      最近更新 更多