由于变量被定义出来后,只是暂存在内存中,等到程序执行到某一个点后,该变量会被释放掉,也就是说变量有它的生命周期。因此变量的有效范围是指程序代码能够访问该变量的区域,若超出该区域访问变量则编译时会出现错误。在程序中,一般会根据变量的有效范围,将变量分为“成员变量”和“局部变量”。
在类体中所定义的变量被称为成员变量。成员变量在整个类中都有效,所以成员变量也称作全局变量。
成员变量的有效范围是整个类的代码段,也就是在类体中的任何位置都可以使用该变量。
例 声明成员变量,并在不同方法中为成员变量赋值,代码如下:
public class Temp
{
int num=0;
float price=
public void
method1(){ // 方法1访问变量num和price
num=1;
price=
}
public void
method2(){ // 方法2也可以访问变量num和price
num=num*10;
price=price*
}
}
类的成员变量又可分为静态变量和实例变量两种。
l 静态变量
静态变量的有效范围是整个类,并且可以被类的所有实例共享。可通过“类名.静态变量名”的方式来访问静态变量。静态变量的生命周期取决于类的生命周期,当类被加载时,为类中的静态变量分配内存空间,当卸载类时,释放静态变量占用的空间,静态变量被销毁。类加载时,就为静态变量分配内存空间,之后无论创建了多少类的实例,都不会再为静态变量分配内存空间,这些实例会使用同一个静态变量。
l 实例变量
实例变量与类的实例对应,它的有效范围是整个实例。每创建一个类的实例,都会为当前实例分配实例变量的内存空间。所以实例变量的生命周期取决于实例的生命周期,实例被创建时,为实例变量分配内存空间,当销毁实例时,释放实例变量占用的内存空间。
例 声明静态变量和实例变量,实例代码如下:
public class Temp
{
int x =
45; //定义实例变量
static int y =
90; //定义静态变量
}
在方法体中定义的变量就是一种局部变量,局部变量只在当前代码块(即花括号之内)中有效。局部变量的生命周期取决于声明位置的代码块,超出这个代码块的范围就不能在使用代码块内的局部变量。
就拿方法类说,方法内声明的变量、包括参数变量都属于局部变量,当方法被调用时,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 运行结果