gpt4 book ai didi

java 。重新声明类初始值设定项内的类字段和方法嵌套 block (框架大括号)差异中的局部变量

转载 作者:太空宇宙 更新时间:2023-11-04 06:49:19 25 4
gpt4 key购买 nike

我准备 scjp 考试并注意到我的令人惊讶的行为。

public class Test {
int k;
{
int k; // it is valid variant
}
public static void main(String[] args) {
int kk;
{
int kk; // NOT VALID.java: variable kk is already defined in method main(java.lang.String[])
}
}
public void method (int var){
int var;//NOT VALID.java: variable var is already defined in method method(int)

}
}

我始终牢记以下规则:我认为所有三种变体都是可能的,并且内部定义将与外部重叠。

示例表明这是错误的规则。

请澄清这种情况并解释熟悉情况的通用规则。

附注

public class Test {
int k;
{
int k;
{
int k; //java: variable k is already defined in instance initializer of class Test
}
}
}

最佳答案

名称隐藏在JLS 6.4 Shadowing and Obscuring中进行了解释。 。我为您的每个示例提供了相关部分。

局部变量可能隐藏字段

public class Test {
int f; // field declaration
{ // init block
int f; // WARNING: Local variable f is hiding a field from type Test
}
}

由于这段代码是直接在类中声明的,因此第一个 int f; 定义了一个字段,而该 block 实际上是一个初始化 block 。 init block 声明一个局部变量,该变量隐藏该 init block 内的字段名称。这是有效的(但由于警告而劝阻)。

局部变量不能隐藏方法参数

public void method (int param){
int param; // NOT VALID
}

这是无效的,因为 JLS 6.4明确指出:

It is a compile-time error if the name of a formal parameter is redeclared as a local variable of the method or constructor

局部变量不能隐藏局部变量(在同一个“局部空间”中)

作为JLS 6.4状态:

It is a compile-time error if the name of a local variable v is redeclared as a local variable of the directly enclosing method, constructor, or initializer block within the scope of v

public static void main(String[] args) {
int local;
{
int local; // NOT VALID: local declaration in same method
}
}

这里,第二个语句尝试声明相同的名称,作为同一直接封闭方法的另一个局部变量,并且在前一个声明的范围内。无效。

public class Test {
int f; // field declaration
{ // init block
int f; // VALID: local declaration hiding field
{ // nested local block
int f; // NOT VALID: local declaration in same init block
}
}
}

这里,第一个语句声明一个字段。然后启动一个 init block ,并声明一个局部变量,从而掩盖了字段的名称(第二个声明是有效的)。现在,声明了一个嵌套 block ,其中另一个局部变量(第三个声明)直接封闭 init block ,并且位于第二个声明的范围内。无效。

关于 java 。重新声明类初始值设定项内的类字段和方法嵌套 block (框架大括号)差异中的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23562431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com