### 变量的有效范围

由于变量被定义出来后，只是暂存在内存中，等到程序执行到某一个点后，该变量会被释放掉，也就是说变量有它的生命周期。因此变量的有效范围是指程序代码能够访问该变量的区域，若超出该区域访问变量则编译时会出现错误。在程序中，一般会根据变量的有效范围，将变量分为“成员变量”和“局部变量”。

#### 1．成员变量

在类体中所定义的变量被称为成员变量。成员变量在整个类中都有效，所以成员变量也称作全局变量。

成员变量的有效范围是整个类的代码段，也就是在类体中的任何位置都可以使用该变量。

例 声明成员变量，并在不同方法中为成员变量赋值，代码如下：

public class Temp {

int num=0;

float price=3.50f;

public void method1(){ // 方法 1 访问变量 num 和 price

num=1;

price=12.55f;

}

public void method2(){ // 方法 2 也可以访问变量 num 和 price

num=num*10;

price=price*0.5f;

}

}

类的成员变量又可分为静态变量和实例变量两种。

l 静态变量

静态变量的有效范围是整个类，并且可以被类的所有实例共享。可通过“类名.静态变量名”的方式来访问静态变量。静态变量的生命周期取决于类的生命周期，当类被加载时，为类中的静态变量分配内存空间，当卸载类时，释放静态变量占用的空间，静态变量被销毁。类加载时，就为静态变量分配内存空间，之后无论创建了多少类的实例，都不会再为静态变量分配内存空间，这些实例会使用同一个静态变量。

l 实例变量

实例变量与类的实例对应，它的有效范围是整个实例。每创建一个类的实例，都会为当前实例分配实例变量的内存空间。所以实例变量的生命周期取决于实例的生命周期，实例被创建时，为实例变量分配内存空间，当销毁实例时，释放实例变量占用的内存空间。

例 声明静态变量和实例变量，实例代码如下：

public class Temp {

int x = 45; //定义实例变量

static int y = 90; //定义静态变量

}

#### 2．局部变量

在方法体中定义的变量就是一种局部变量，局部变量只在当前代码块（即花括号之内）中有效。局部变量的生命周期取决于声明位置的代码块，超出这个代码块的范围就不能在使用代码块内的局部变量。

就拿方法类说，方法内声明的变量、包括参数变量都属于局部变量，当方法被调用时，Java 虚拟机为方法中的局部变量分配内存空间，当该方法的调用结束后，则会释放方法中局部变量占用的内存空间，局部变量也将会销毁，然后 Java 的垃圾回收机制会在某一时刻清理该内存空间。

变量的有效范围如图 1 所示：

说明：局部变量可与全局变量的名字相同，此时全局变量将被隐藏，但是可以使用“this.”做前缀来访问全局变量。

图 1 变量的有效范围

例 在项目中创建类 ValClass，分别定义名称相同的局部变量与成员变量，当名称相同时成员变量将被隐藏。

public class ValClass{ //新建类

static String words = "成员变量"; //定义成员变量 words

public static void main(String[] args) { //主方法

String words = "局部变量"; //定义局部变量 words

System.out.println("words 变量现在是：" + words); //将 words 的值输出

}

}

运行结果如图 2 所示。

图 2 运行结果