变量的作用域

 一、静态变量和实例变量

    变量的作用域是指它的存在范围,只有在这个范围内,程序代码才能访问它。其次,作用域决定了变量的生命周期。变量可分为:

  成员变量:在类中声明,它的作用域是整个类。

  局部变量:在一个方法的内部或方法的一个代码块的内部声明。

  方法参数:方法或者构造方法的参数,它的作用域是整个方法或者构造方法。

  成员变量可以在类中方法以外的任何地方定义。而局部变量必须先定义后使用。

      类的成员变量有两种:一种被static关键字修饰的变量,叫类变量或静态变量;另一种是没有被static关键字修饰的变量,叫实例变量。

  (1)类的静态变量在内存中只有一个,Java虚拟机在加载类的过程中为静态变量分配内存,被类的所有实例共享。静态变量可以直接通过类名被访问。静态变量的生命周期取决于类的生命周期。

  (2)类的每个实例都有相应的实例变量。每创建一个类的实例,Java虚拟机就会为实例变量分配一次内存。实例变量的什么周期取决于实例的什么周期。

二、局部变量的生命周期

  局部变量的生命周期取决于所属的方法何时被调用及结束调用。

 1 public class Sample{
 2     int var1 = 1;          //实例变量
 3     static int var2 = 2;      //静态变量
 4     public int add(){
 5         int var3 = var1 + var2;    //局部变量
 6          return var3;
 7 }
 8    public int delete(){
 9       int var4 = var1 - var2;     //局部变量
10       return var4;  
11 }
12     public static void main(String[] args){
13      new Sample().add();
14 }
15 } 

  当执行“java Sample”命令时,Java虚拟机执行以下流程。

  (1)加载Sample类,开始静态变量var2的生命周期

  (2)创建Sample实例,开始实例变量var1的生命周期

  (3)调用Sample实例的add()方法,开始局部变量var3的生命周期

  (4)执行完毕Sample实例的add()方法,结束局部变量var3的生命周期

  (5)执行完毕Sample类的main()方法,结束Sample实例及实例变量var1,卸载Sample类,结束静态变量var2的生命周期。

 

  局部变量的限制:

  (1)局部变量不能被static、private、protected和public等修饰符修饰。

  (2)不能通过类名或引用变量名来访问局部变量。

三、成员变量和局部变量同名

   在同一个作用域内不允许定于同名的多个变量。在一个方法内,可以定义和成员变量同名的局部变量或参数,此时成员变量被屏蔽。此时如果要访问实例变量,可以通过this关键字来访问,this为当前实例的引用。

 1 public class Scope{
 2   int x; //x为实例变量
 3   int y; //y为实例变量
 4   static int z; //z为静态变量
 5 
 6   void method(int x){ //x为方法参数
 7     int y=1;  //y为局部变量
 8     int z=1;  //z为局部变量
 9     this.x=x+1;  //this.x代表实例变量x;单独的x代表局部变量x
10     this.y=y+1;  //this.y代表实例变量y;单独的y代表局部变量y
11     Scope.z=z+1;  //Scope.z代表静态变量z;单独的z代表局部变量z
12 
13     System.out.println("x="+x);  //打印局部变量x
14     System.out.println("y="+y);  //打印局部变量y
15     System.out.println("z="+z);  //打印局部变量z
16     System.out.println("this.x="+this.x);  //打印实例变量x
17     System.out.println("this.y="+this.y);  //打印实例变量y
18     System.out.println("Scope.z="+Scope.z);  //打印静态变量z
19   }
20 
21   public static void main(String args[]){
22     Scope obj=new Scope();
23     obj.method(1);
24   }
25 }
26 
27 /****************************************************
28  * 作者:孙卫琴                                     *
29  * 来源:<<Java面向对象编程>>                       *
30  * 技术支持网址:www.javathinker.org                *
31  ***************************************************/

四、将局部变量的作用域最小化

  

posted @ 2014-08-15 21:57  Phil Li  阅读(428)  评论(0编辑  收藏  举报