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

时间:2013-10-07 20:17:14

标签: java variables parameters scope local-variables

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

•实例变量

•局部变量

•参数

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

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

3 个答案:

答案 0 :(得分:3)

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

以此为例:

// 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);
}

答案 1 :(得分:2)

Java Language Specification identifies 7 types of variables。他们的描述是

  

类变量是在a中使用关键字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)传递给a的名称参数值   构造

     

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

     

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

     

使用与之关联的实际对象初始化新变量   例外(§11.3,§14.18)。有效的异常参数   在执行与catch相关联的块时不再存在   条款已经完成。

     

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

     

每当控制流进入一个区块(第14.2节)或语句时   (§14.14),为声明的每个局部变量创建一个新变量   在一个局部变量声明语句中立即包含在   阻止或声明。

您还应该阅读variable scope,其中描述了您的应用程序中可以使用某个命名实体的位置。

  

因此我的问题是他们为什么要对参数和本地进行分类   变量作为不同类别的变量,如果它们包含   相同的范围

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

答案 2 :(得分:0)

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

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