当前位置: 首页 > 面试题库 >

为什么在Java中,方法外的变量会有重复的变量名?

乐成济
2023-03-14
问题内容

我正在学习Java,并且我知道您不能将内部范围内声明的变量命名为与外部范围内声明的变量相同的名称,如下所示

public class Practice {
    public static void main(String[] args){
        int x = 10;
        if (x == 10){
            int x = 10;
        }           
    }   
}

但是,我发现以下行为不合法

public class Practice {
    int x = 10;
    public static void main(String[] args){
        int x = 10;
        if (x == 10) {
        }           
    }   
}

这不是两次声明的变量吗?


问题答案:

这不是两次声明的变量吗?

不它不是。因为它们都在不同的范围内。函数x外部main具有 类级别范围,函数x内部main具有
html" target="_blank">方法/函数级别范围

具有不同作用域的两个变量具有相同的名称是合法的。

请务必阅读第6.3节。JLS
声明的范围。以下是该节中的一些陈述。

声明的范围是程序的区域,在该区域中可以使用简单的名称引用声明所声明的实体(如果可见)(第6.4.1节)。

当且仅当声明的范围包括该点时,声明才在程序的特定点处。

块中的局部变量声明的范围(第14.4节)是该声明在其中出现的其余部分,从其自身的初始化程序开始,并在局部变量声明语句的右侧包括其他任何声明符。

有很多与范围相关的概念,例如 阴影
,请阅读§6.4。遮蔽和遮盖。

JLS是学习Java允许和禁止的最佳场所。 随意在那里阅读章节。



 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 为什么在匿名类中只能访问最终变量? (15个答案) 为什么实例变量“忽略Lambda表达式中使用的变量必须是最终变量或实际上是最终变量”警告[重复] (2个答案) Lambdas:局部变量不需要最终变量,实例变量不需要 (10个答案) 2年前关闭。 当我编写此代码时,我收到一个编译时错误,该错误是: “ lambda中的变量必须是final或有效的fin

  • 如何使像这样打印: 在调试过程中,我曾在许多地方将许多打印语句作为日志编写。我会写这样的声明 我想要一个打印变量名和变量值的方法。在C中,可以按如下方式进行: 有什么办法可以做到这一点吗? 提前感谢。

  • 出于某种原因,当我尝试运行这段代码时,它总是返回找不到符号。然后我发现问题是变量无法解析为变量。我不知道为什么它无法将其解析为变量。

  • 问题内容: 请帮助我理解常量变量和Java变量之间的区别。我对此有些困惑。 问题答案: 常量 是概念,是变量的属性。 是用于声明常量变量的java关键字。 正如其他人所指出的那样,从语义/语言的观点来看, 常量变量 的表达是矛盾的,因此,我们可以争论其正确性。 引用规范,无论如何,我们可以阅读 原始类型的最终变量,并使用编译时常数表达式(第15.28节)进行了初始化,称为 常量变量 。 因此,我想

  • 问题内容: 除了范围和存储差异外,java中实例变量和局部变量之间是否还有其他主要区别? 问题答案: 我能想到的一件事: 实例变量具有默认值,即如果为对象引用,则为null;如果为int,则为0。 局部变量不会获取默认值,因此需要进行显式初始化(​​如果您未这样做,则编译器通常会抱怨)。

  • 问题内容: 在阅读有关Java的书时,我看到了一个这样编写的示例。我想知道我可以在main方法之外声明变量吗?在main方法外部和内部声明变量之间有什么区别?“静态”在这里的作用是什么?请有人给我解释一下吗?我是Java新手。 最好的祝福。 问题答案: 1)内部与外部: 如果 在 方法 内部 声明对象,则该对象仅在该方法中可见。基本上,如果在其周围放置方括号,则只能从这些方括号内看到/访问它。 如