我正在阅读我的 AP cs 书,它谈到了三种类型的变量:
•实例变量
•局部变量
•参数
实例变量在整个类中都是可见的等等......参数只能在方法中使用,局部变量也是如此。. .
因此,我的问题是,如果它们包含相同的范围,为什么它们会将参数和局部变量分类为不同类别的变量。. . 尽管它们的用途不同。
我正在阅读我的 AP cs 书,它谈到了三种类型的变量:
•实例变量
•局部变量
•参数
实例变量在整个类中都是可见的等等......参数只能在方法中使用,局部变量也是如此。. .
因此,我的问题是,如果它们包含相同的范围,为什么它们会将参数和局部变量分类为不同类别的变量。. . 尽管它们的用途不同。
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 节)。当不再引用数组时,数组组件实际上不再存在。
方法参数(第 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 语句中立即包含的局部变量声明语句中声明的每个局部变量创建一个新变量。
您还应该阅读有关变量范围的信息,它描述了可以在应用程序中使用某些命名实体的位置。
因此我的问题是,如果它们包含相同的范围,为什么它们会将参数和局部变量分类为不同类别的变量
从上面的描述可以看出,它们不包含相同的范围,因此需要加以区分。
因为它们不一定具有相同的范围。
拿这个案例:
// 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);
}
局部变量在方法中被初始化,而参数被传递到方法中。
public void method(int abc) //parameter
int xyz = 0; //local variable