【发布时间】:2013-10-14 13:30:00
【问题描述】:
我正在阅读我的 AP cs 书,其中谈到了三种类型的变量:
•实例变量
•局部变量
•参数
实例变量在整个类中都是可见的等等... 参数只能在方法中使用,局部变量也是如此。 . .
因此我的问题是,如果它们包含相同的范围,为什么他们会将参数和局部变量分类为不同类别的变量。 . .尽管它们的用途不同。
【问题讨论】:
标签: java variables parameters scope local-variables
我正在阅读我的 AP cs 书,其中谈到了三种类型的变量:
•实例变量
•局部变量
•参数
实例变量在整个类中都是可见的等等... 参数只能在方法中使用,局部变量也是如此。 . .
因此我的问题是,如果它们包含相同的范围,为什么他们会将参数和局部变量分类为不同类别的变量。 . .尽管它们的用途不同。
【问题讨论】:
标签: java variables parameters scope local-variables
局部变量在方法中初始化,参数传入方法中。
public void method(int abc) //parameter
int xyz = 0; //local variable
【讨论】:
Java Language Specification identifies 7 types of variables。他们的描述是
类变量是使用关键字 static 声明的字段 类声明(第 8.3.1.1 节),或者带有或不带有关键字 static 在接口声明中(第 9.3 节)。
类变量在其类或接口准备好时创建 (§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) 已完成。
数组组件是未命名的变量 每当一个新对象被初始化为默认值(§4.12.5) 创建一个数组(第 10 节、第 15.10 节)。有效的数组组件 当不再引用数组时不再存在。
方法参数(第 8.4.1 节)命名参数值传递给方法。
对于方法声明中声明的每个参数,一个新参数 每次调用该方法时都会创建变量(第 15.12 节)。新的 变量用相应的参数值初始化 方法调用。方法参数实际上不复存在 当方法体执行完成时。
构造函数参数(第 8.8.1 节)名称参数值传递给 构造函数。
对于在构造函数声明中声明的每个参数,一个新的 每次创建类实例时都会创建参数变量 表达式(第 15.9 节)或显式构造函数调用(第 8.8.7 节)调用 那个构造函数。新变量被初始化为 来自创建表达式的相应参数值或 构造函数调用。构造函数参数有效地停止 当构造函数的主体执行时存在 完成。
异常参数在每次被异常捕获时创建 try 语句的 catch 子句(第 14.20 节)。
新变量被初始化为与关联的实际对象 例外(第 11.3 节、第 14.18 节)。异常参数有效 当执行与 catch 关联的块时不再存在 子句完成。
局部变量由局部变量声明语句声明 (§14.4)。
每当控制流进入块(第 14.2 节)或 for 语句时 (§14.14),为每个声明的局部变量创建一个新变量 在立即包含的局部变量声明语句中 该块或 for 语句。
您还应该阅读variable scope,它描述了可以在您的应用程序中使用某些命名实体的位置。
因此我的问题是他们为什么要对参数和本地进行分类 变量作为不同类别的变量,如果它们包含 范围相同
从上面的描述可以看出,它们不包含相同的范围,因此需要加以区分。
【讨论】:
因为它们不一定具有相同的范围。
举个例子:
// 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);
}
【讨论】:
while 循环内的变量,在循环完成后,它不再可以访问。这是一个很好的例子(在我看来)参数和局部变量之间的区别根据范围。 编辑当然这是一个例子。局部变量也可以与参数在同一范围内 - meh 与 foo 共享范围。