Java虚拟机会为声明的变量分配存储空间,用于存储数据。在程序运行过程中,当变量不再使用时,Java虚拟机会释放为变量分配的存储空间,此时变量已经完成了它的使命,变量处于消亡状态,因此变量是有生命周期的。
变量的生命周期是指从声明一个变量并分配存储空间开始,到释放该变量并清除所占用的内存空间结束。前面说过,在类中声明变量时,可以在类体中声明变量,也可以在类的方法中声明变量。在类中声明变量的位置,决定了变量的有效范围。
变量的有效范围是指程序代码能够访问变量的区域。在类方法中声明的变量只能在类的方法内部使用,类方法内部的代码可以访问该变量,类方法外部的代码如果访问该变量,代码编译时会报错。在类体中声明的变量,可以在整个类的内部使用。
根据变量的有效范围,可以把变量分为全局变量和局部变量。全局变量在类体中声明,全局变量也称为成员变量,多用于类的属性声明。局部变量在类方法中声明,多用于方法内部存储临时数据,其有效范围仅限于该变量所在的方法内。
成员变量(全局变量)
按照变量的访问方式,成员变量又分为静态变量和实例变量。
静态变量用static关键字修饰,只要类被加载到内存,静态变量就会被分配存储空间。静态变量可以在类没有实例化的情况下,其他类可以通过“类名.静态变量”的方式访问该变量。
实例变量只有在类被实例化的情况下,才能够分配存储空间。其他类可以通过“实例化对象名.实例变量”方式访问该变量。
关于类的实例化在后面的课程内容会详细讲述。
局部变量
在类方法中声明的变量称为局部变量,局部变量的有效范围只能在声明该变量的方法体内,方法体外的代码不能访问该变量。
当方法被调用时,Java虚拟机会为方法内的变量分配存储空间,当方法调用结束后,Java虚拟机会释放方法内所有变量的已分配的存储空间,变量也被销毁。
在方法体内声明的变量名称(局部变量)可以和类体中声明的变量名称(成员变量)相同,此时方法体内的变量会掩盖成员变量,成员变量在该方法中失效。
变量的有效范围如下图所示:
变量的有效范围
案例1:在PBaseUnit43Case1项目unit43包下创建Case2类,在类中声明一个静态变量age,一个实例变量name,在main方法中声明一个局部变量height和name,然后输出age、name、height三个变量的值到控制台。代码如下:
/**
* @Title: Case2.java
* @Package unit43
* @Description: Java基础知识课程案例
* @author 编程训练营
* @date
* @version V1.0
*/
package unit43;
/**
* @ClassName: Case2
* @Description: Java语言基础学习单元(变量的有效范围)案例1
* @author 编程训练营
* @date
*
*/
public class Case2 {
// 声明静态变量age
static String age = "21";
// 声明实例变量name
String name = "Mary";
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 声明局部变量height
int height = 45;
/**
* 局部变量name和实例变量name名称相同
* 实例变量name失效
*/
String name = "Henry";
// 输出静态变量age
System.out.println("静态变量age为:"+ age);
// 输出实例变量name,实际输出的是局部变量name
System.out.println("实例变量name为:"+ name);
// 输出局部变量height
System.out.println("局部变量height为:"+ height);
}
}程序运行结果如下图所示:
