Java 为什么可以用相同的名称声明变量?

Java 为什么可以用相同的名称声明变量?,java,Java,Java不允许使用相同名称的相同类型变量 类似这样的代码将有一条错误消息:“复制局部变量” 但是对于这段代码,“inta”在while循环中声明了三次(因为这个while循环运行了3次,所以“inta”也声明了3次) 为什么编译器允许它通过编译 public static void main(String[] args) { int i=3; while (i>0) { int a=1; System.out.println("1&q

Java不允许使用相同名称的相同类型变量

类似这样的代码将有一条错误消息:“复制局部变量”

但是对于这段代码,“inta”在while循环中声明了三次(因为这个while循环运行了3次,所以“inta”也声明了3次)

为什么编译器允许它通过编译

public static void main(String[] args)  {  
    int i=3;
    while (i>0) {
      int a=1;
      System.out.println("1");  
      i--;
     }
} 

循环的作用域会重置每次迭代,因此
a
将从堆栈中移除,并可以再次声明

注意:此有效,可能是您想要的

int a = 1;
a = 1;
“变量声明”发生在编译时,而不是运行时。即使在循环中声明变量,该变量也只声明一次


在运行时,变量“a”只存在一个副本,在循环迭代期间既不会创建也不会销毁它。

一个变量总共有4个sope

类作用域:定义为静态的变量称为类级变量,对于特定类只创建一次,并且在该类的整个生命周期中使用相同的变量

实例范围:这些变量在类级别定义为非ststic。该特定实例的变量if的范围。如果创建一个类的两个实例,那么每个实例都有自己的变量和存储

局部范围:这些变量在方法内部或作为方法的参数定义。这些变量的范围仅适用于该方法。无法在方法之外访问它

块范围:这些变量在方法中的特定块(if、while、for、switch等)内定义。变量只能在该块内部访问,它可以在该块外部评估

在您的例子中,变量
i
是一个局部变量,因此它将可用于该特定方法。变量
a
是一个块变量,该变量的范围仅适用于while循环单次迭代。一旦开始执行while循环,它将创建变量
a
,并且一旦第一次迭代的执行完成,它将销毁该变量。因此,在下一次迭代中,同样的过程也将遵循

int a = 1;
a = 1;