变量的作用域
一、静态变量和实例变量
变量的作用域是指它的存在范围,只有在这个范围内,程序代码才能访问它。其次,作用域决定了变量的生命周期。变量可分为:
成员变量:在类中声明,它的作用域是整个类。
局部变量:在一个方法的内部或方法的一个代码块的内部声明。
方法参数:方法或者构造方法的参数,它的作用域是整个方法或者构造方法。
成员变量可以在类中方法以外的任何地方定义。而局部变量必须先定义后使用。
类的成员变量有两种:一种被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 ***************************************************/
四、将局部变量的作用域最小化