以下方法不起作用,因为内部块声明的变量与外部块中的变量同名。显然,变量属于声明它们的方法或类,而不属于声明它们的块,因此,我无法编写一个简短的临时临时块进行调试,而恰好将外部作用域中的变量压入阴影只是片刻:
void methodName() {
int i = 7;
for (int j = 0; j < 10; j++) {
int i = j * 2;
}
}
我使用过的几乎每种块范围语言都支持此功能,包括我在学校为解释器和编译器编写的琐碎小语言。Perl可以做到这一点,Scheme甚至C都可以做到。甚至PL /
SQL也支持这一点!
Java做出此设计决定的理由是什么?
编辑:正如有人指出的那样,Java确实具有块作用域。我要问的概念叫什么名字?我希望我能从这些语言设计课程中记住更多。:)
我认为其基本原理是,在大多数情况下,这不是故意的,它是编程或逻辑缺陷。
在像您这样琐碎的示例中,它是显而易见的,但是在一大段代码中,意外地重新声明变量可能并不明显。
ETA:它也可能与Java中的异常处理有关。我认为这个问题的一部分在一个问题中进行了讨论,该问题与为什么在try /
final范围中没有在try部分中声明的变量有关。
问题内容: 在其他任何地方都可以访问在静态块内声明的变量吗?他们是什么样的成员(即,他们也是静态成员吗?) 问题答案: 通常,程序员不需要在静态块内声明任何变量,通常这仅是为了确保初始化静态变量以供类的所有实例使用(取决于静态变量的范围)。 与方法和构造函数变量一样,在静态块内声明的变量将在该块内是局部的。 JDK文件
问题内容: 这将编译 这不会 我希望两者都能编译(也许这是C的工作方式?)。是什么原因导致无法在外部块中以相同的名称声明一个块中的变量? 问题答案: 简短的答案是:因为这是JLS§6.4中定义Java语言的方式。 您可能从其他语言中使用过,因此允许使用所谓的可变阴影。但是,Java语言的发明者认为这是一个笨拙的功能,他们不希望使用其语言: 此限制有助于检测其他一些非常模糊的错误。 但是,正如作者在
问题内容: Ada,Pascal和许多其他语言都支持范围,这是对整数进行子类型的一种方式。范围是一个有符号整数值,范围从一个值(第一个)到另一个值(最后一个)。实现一个在OOP中执行相同操作的类很容易,但是我认为本机支持该功能可以使编译器进行其他静态检查。 我知道无法静态地验证范围内定义的变量不会“溢出”运行时(即由于输入错误),但是我认为可以做些什么。我考虑了按合同设计方法(Eiffel)和Sp
我有1个文件,对它添加了一个测试文件: test06.ts 当我在test06.spec.ts中引用此函数的时候报错:
例如: 但是你可以在块之前声明它,然后它就可以正常工作了: 我只是想知道这样做的设计原因。为什么在块中创建的对象不在方法其余部分的范围内?也许我没有深入了解除了只是观察抛出的之外是如何工作的。
问题内容: javascript中变量的范围是什么?它们在函数内部和外部的作用域是否相同?还是有关系吗?另外,如果变量是全局定义的,则将变量存储在哪里? 问题答案: TLDR JavaScript具有词汇(也称为静态)作用域和闭包。这意味着您可以通过查看源代码来确定标识符的范围。 四个范围是: 全球-一切可见 功能-在功能(及其子功能和块)中可见 块-在块(及其子块)中可见 模块-在模块内可见 在