简短的答案是:因为这是JLS§6.4中定义Java语言的方式。
您可能从其他语言中使用过,因此允许使用所谓的可变阴影。但是,Java语言的发明者认为这是一个笨拙的功能,他们不希望使用其语言:
此限制有助于检测其他一些非常模糊的错误。
但是,正如作者在JLS的同一部分中指出的那样,您会在Java的其他地方发现阴影:
对于局部变量对成员的重影进行类似的限制被认为是不切实际的,因为在超类中添加成员可能会导致子类不得不重命名局部变量。相关考虑因素也限制了嵌套类成员对局部变量的重影,或者嵌套类内声明的局部变量对局部变量的重影也没有吸引力。
实际上,这意味着以下代码是合法的:
class A { int x = 0; void m() { int x = 10; // Shadows this.x }}
正如作者所描述的,允许通过声明具有相同名称的方法局部变量来对实例变量进行阴影处理,因为有可能某人扩展了
A一天的功能,
B如果阴影处理是非法的,则您将无法再编译类:
class B extends A { void m() { int x = 10; // Shadows A.this.x if A declares x }}
如果考虑使用允许遮蔽的C之类的语言,则可以找到如下所示的尴尬代码:
int x;int main() { { int x = 0; { extern int x; x = 1; } printf("%dn", x); // prints 0 } printf("%dn", x); // prints 1 return 0;}
由于可变阴影,该程序不太容易遵循,因此可能无法产生预期的结果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)