变量的有效范围

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

1.成员变量

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

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

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

public class Temp {

   int num=0;

   float price=3.50f;

   public void method1(){   // 方法1访问变量numprice

      num=1;

      price=12.55f;

   }

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

      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  运行结果