参数范围与局部变量范围?

我正在阅读我的AP cs书,它谈到了三种类型的变量:

•实例变量

•局部变量

•参数

实例变量在整个类等中都是可见的…参数仅在方法中可用,因此是局部变量。 。 。

因此,我的问题是,如果它们包含相同的范围,它们为什么会将参数和局部变量分类为不同的变量类别。 。 。 尽管它们的用途不同。

因为它们不一定具有相同的范围。

以这种情况为例:

// this is garbage code public void doSomething(int foo) { int meh = 0; while (true) { // can access foo and meh int blah = meh++; if (blah == foo) { break; } } // won't compile, can't access blah anymore System.out.println(blah); // will compile System.out.println(foo); // will compile as well System.out.println(meh); } 

Java语言规范识别7种类型的变量 。 他们的描述是

类变量是在类声明(第8.3.1.1节)中使用关键字static声明的字段,或者在接口声明(第9.3节)中使用或不使用关键字static。

在准备其类或接口(第12.3.2节)时创建类变量,并将其初始化为默认值(第4.12.5节)。 当类或接口被卸载时,类变量实际上不再存在(第12.7节)。

实例变量是在类声明中声明的字段,不使用关键字static(第8.3.1.1节)。

如果类T具有作为实例变量的字段a,则创建新的实例变量a并将其初始化为默认值(第4.12.5节),作为每个新创建的类T对象的一部分或任何类的一部分。 T的子类(第8.1.4节)。 在完成对象(第12.6节)的任何必要的最终化之后,当实例变量不再被引用时,实例变量实际上不再存在。

数组组件是未命名的变量 ,只要创建了一个新的数组对象(第10节,第15.10节),就会创建并初始化为默认值(第4.12.5节)。 当不再引用数组时,arrays组件有效地停止存在。

方法参数 (第8.4.1节)传递给方法的名称参数值。

对于方法声明中声明的每个参数,每次调用该方法时都会创建一个新的参数变量(第15.12节)。 使用方法调用中的相应参数值初始化新变量。 当方法体的执行完成时,方法参数有效地停止存在。

构造函数参数 (第8.8.1节)将名称参数值传递给构造函数。

对于构造函数声明中声明的每个参数,每次类实例创建表达式(第15.9节)或显式构造函数调用(第8.8.7节)调用该构造函数时,都会创建一个新的参数变量。 使用创建表达式或构造函数调用中的相应参数值初始化新变量。 当构造函数的主体的执行完成时,构造函数参数有效地停止存在。

每次try语句的catch子句捕获exception时,都会创建一个exception参数 (§14.20)。

使用与exception关联的实际对象初始化新变量(第11.3节,第14.18节)。 当与catch子句关联的块的执行完成时,exception参数实际上不再存在。

局部变量由局部变量声明语句声明(第14.4节)。

只要控制流进入块(第14.2节)或语句(第14.14节),就会为在该块或for语句中立即包含的局部变量声明语句中声明的每个局部变量创建一个新变量。

您还应该阅读变量范围 ,它描述了在您的应用程序中可以使用某个命名实体的位置。

因此,我的问题是,如果它们包含相同的范围,它们为什么会将参数和局部变量分类为不同的变量类别

从上面的描述中可以看出,它们不包含相同的范围,因此需要进行区分。

局部变量在方法中初始化,而参数传递给方法。

  public void method(int abc) //parameter int xyz = 0; //local variable