java变量的有效范围
变量的有效范围
变量的有效范围是指程序代码能够访问该变量的区域,若超出该区域访问变量,则编译时会出现错误。有效范围决定了变量的生命周期,变量的生命周期是指从声明一个变量并分配内存空间开始,到释放该变量并清除所占用的内存空间结束。进行变量声明的位置,决定了变量的有效范围,根据有效范围的不同,可以将变量分为以下两种。
成员变量:在类中声明,在整个类中有效。
局部变量:在方法内或方法内的某代码块(方法内部,“{”与“}”之间的代码)中声明的变量。在代码块声明的变量,只在当前代码块中有效;在代码块外、方法内声明的变量在整个方法内都有效。
下面先来通过如下代码初步了解成员变量和局部变量的声明及使用范围。
public class Olympics {
private int medal_All=800; //成员变量
public void China(){
int medal_CN=100; //方法的局部变量
if(true){ //代码块
int gold=50; //代码块的局部变量
medal_CN+=50; //允许访问
medal_All-=150; //允许访问
}
gold=100; //编译出错
medal_CN+=100; //允许访问
medal_All-=200; //允许访问
}
public void Other(){
medal_All=800; //允许访问
medal_CN=100; //编译出错, 不能访问其他方法中的局部变量
gold=10; //编译出错
}
}
1.成员变量
类的成员变量又可分为两种:静态变量和实例变量。静态变量是指通过static关键字进行修饰的成员变量,没有被static关键字修饰的变量为实例变量。它们的区别如下。
静态变量的有效范围是整个类,并且可以被类的所有实例共享。可以通过“类名.变量名”的方式来访问静态变量。静态变量的生命周期取决于类的生命周期,当类被加载时,为类中的静态变量分配内存空间,当卸载类时,释放静态变量占用的空间,静态变量被销毁。类加载时,就为静态变量分配内了存空间,之后无论创建了多少类的实例,都不会再为静态变量分配内存空间,这些实例会使用同一个静态变量。
实例变量与类的实例对应,它的有效范围是整个实例。每创建一个类的实例,都会为当前实例分配实例变量的内存空间。所以实例变量的生命周期取决于实例的生命周期,实例被创建时,为实例变量分配内存空间,当销毁实例时,释放实例变量占用的内存空间。
下面通过代码及图2.1来介绍静态变量与实例变量的区别。
先来创建一个类,并声明一个实例变量和一个静态变量,代码如下:
public class Student{
public static int amount=100; //声明一个静态变量amount
public int age=24; //声明一个实例变量age
}
然后创建Student类的两个实例,代码如下:
Student st1=new Student();
Student st2=new Student();
此时,Java虚拟机的运行时数据区中为Student类的两个实例以及静态变量、实例变量的空间分配如图1所示。
图1 Java虚拟机运行时数据区
下面分别通过引用变量st1和st2,来修改各自所引用实例中的实例变量age,并通过st2引用变量来修改静态变量amount,代码如下:
st1.age+=2;
st2.age+=3;
st2.amount+=100; //或通过类名进行访问: Student.amount+=100
此时的Java虚拟机的运行时数据区中存储的两个实例的实例变量及类的静态变量的值发生了改变,如图2所示。
图2 Java虚拟机运行时数据区
2.局部变量
在类的方法中声明的变量,包括方法的参数,都属于局部变量,它们只在当前的方法内有效,不能用于类的其他方法中。在方法的代码块中声明的变量也是局部变量,但它只在该代码块内有效。
局部变量的生命周期取决于方法,当方法被调用时,Java虚拟机为方法中的局部变量分配内存空间,当方法的调用结束后,则释放该方法中局部变量占用的内存空间,局部变量被销毁。
可以声明一个与成员变量同名称的局部变量,此时在方法中访问该变量,针对的是方法中的局部变量;否则若没有在方法中声明与成员变量同名称的局部变量,在方法中访问该变量时针对的是成员变量。例如:
public class Access{
private int times=3;
private static int order=2;
public static void main(String[] args) {
int times=5;
System.out.println(times); //输出结果为: 5
System.out.println(order); //输出结果为: 2
}
}
在声明及访问局部变量时,需要注意以下两点。
在声明时,不能使用public、protected、private和static关键字对局部变量进行修饰。
不能通过类名或引用变量来访问局部变量。