java - 为什么 Java 没有 block 作用域的变量声明?

标签 java syntax language-design

以下方法不起作用,因为内部 block 声明了一个与外部 block 中的变量同名的变量。显然变量属于声明它们的方法或类,而不属于声明它们的 block ,因此我无法编写一个简短的临时 block 用于调试,它恰好将外部范围中的变量插入阴影只是片刻:

void methodName() {
  int i = 7;
  for (int j = 0; j < 10; j++) {
    int i = j * 2;
  }
}

几乎我用过的所有 block 作用域语言都支持这一点,包括我在学校为之编写解释器和编译器的琐碎小语言。 Perl 可以做到这一点,Scheme 也可以,甚至 C。甚至 PL/SQL 也支持这一点!

这个 Java 设计决策的基本原理是什么?

编辑:正如有人指出的那样,Java 确实具有 block 作用域。我要问的概念的名称是什么?我希望我能从那些语言设计类(class)中记住更多。 :)

最佳答案

嗯,严格来说,Java 确实有 block 作用域的变量声明;所以这是一个错误:

void methodName() {
  for (int j = 0; j < 10; j++) {
    int i = j * 2;
  }
  System.out.println(i); // error
}

因为 'i' 不存在于 for block 之外。

问题是 Java 不允许您创建与在同一方法的外部 block 中声明的另一个变量同名的变量。正如其他人所说,据说这样做是为了防止难以识别的错误。

关于java - 为什么 Java 没有 block 作用域的变量声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/141140/

相关文章:

java - 与 python psycopg2 相比,使用 clojure jdbc 将文件记录插入 postgres db 需要很长时间

MYSQL where子句导致语法错误

c++ - 为什么 C++ 中存在 delete[] 语法?

php - PHP中单引号和双引号字符串有什么区别?

python - 为什么 Python 中没有 "and"和 "or"运算符?

java - PowerMockito thenReturn 返回错误的对象

java - 三元运算符和意外的 NullPointerException

java - 我如何参数化这个 Java 泛型?

.net - 为什么子不能同时实现接口(interface)和处理事件?

scripting - 创建 "Europanto"类型的通用脚本语言的障碍是什么?