1、变量的有效范围变量的有效范围是指程序代码能够访问该变量的区域,若超出该区域访问变量,则编译时会出现错误。有效范围决定了变量的生命周期,变量的生命周期是指从声明一个变量并分配内存空间开始,到释放该变量并清除所占用的内存空间结束。进行变量声明的位置,决定了变量的有效范围,根据有效范围的不同,可以将变量分为以下两种。成员变量:在类中声明,在整个类中有效。局部变量:在方法内或方法内的某代码块(方法内部, “”与“”之间的代码)中声明的变量。在代码块声明的变量,只在当前代码块中有效;在代码块外、方法内声明的变量在整个方法内都有效。下面先来通过如下代码初步了解成员变量和局部变量的声明及使用范围。publi
2、c 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; /编译出错, 不能访问其他方法中的局部变量g
3、old=10; /编译出错1成员变量类的成员变量又可分为两种:静态变量和实例变量。静态变量是指通过 static 关键字进行修饰的成员变量,没有被 static 关键字修饰的变量为实例变量。它们的区别如下。静态变量的有效范围是整个类,并且可以被类的所有实例共享。可以通过“类名.变量名”的方式来访问静态变量。静态变量的生命周期取决于类的生命周期,当类被加载时,为类中的静态变量分配内存空间,当卸载类时,释放静态变量占用的空间,静态变量被销毁。类加载时,就为静态变量分配内了存空间,之后无论创建了多少类的实例,都不会再为静态变量分配内存空间,这些实例会使用同一个静态变量。实例变量与类的实例对应,它的有
4、效范围是整个实例。每创建一个类的实例,都会为当前实例分配实例变量的内存空间。所以实例变量的生命周期取决于实例的生命周期,实例被创建时,为实例变量分配内存空间,当销毁实例时,释放实例变量占用的内存空间。下面通过代码及图 2.1 来介绍静态变量与实例变量的区别。先来创建一个类,并声明一个实例变量和一个静态变量,代码如下:public class Studentpublic static int amount=100; /声明一个静态变量 amountpublic int age=24; /声明一个实例变量 age然后创建 Student 类的两个实例,代码如下:Student st1=new St
5、udent();Student st2=new Student();下面分别通过引用变量 st1 和 st2,来修改各自所引用实例中的实例变量 age,并通过 st2 引用变量来修改静态变量 amount,代码如下:st1.age+=2;st2.age+=3;st2.amount+=100; /或通过类名进行访问: Student.amount+=1002局部变量在类的方法中声明的变量,包括方法的参数,都属于局部变量,它们只在当前的方法内有效,不能用于类的其他方法中。在方法的代码块中声明的变量也是局部变量,但它只在该代码块内有效。局部变量的生命周期取决于方法,当方法被调用时,Java 虚拟机为
6、方法中的局部变量分配内存空间,当方法的调用结束后,则释放该方法中局部变量占用的内存空间,局部变量被销毁。可以声明一个与成员变量同名称的局部变量,此时在方法中访问该变量,针对的是方法中的局部变量;否则若没有在方法中声明与成员变量同名称的局部变量,在方法中访问该变量时针对的是成员变量。例如:public class Accessprivate int times=3;private static int order=2;public static void main(String args) int times=5;System.out.println(times); /输出结果为: 5Syste
7、m.out.println(order); /输出结果为: 2在声明及访问局部变量时,需要注意以下两点。在声明时,不能使用 public、protected 、private 和 static 关键字对局部变量进行修饰。不能通过类名或引用变量来访问局部变量。java 实例变量和类变量首先要知道 java 的成员变量分为: 实例变量和类变量(也就是 static 变量).当 JAVA 程序执行时,类的字节码文件就被加载到内存 ,如果该类没有创建对象,类的实例成员变量不会被分配内存,但是类中的类变量在类被加载到内存的时候,就分配了相应的内存空间.如果该类创建对象,那么不同的实例变量互不相同,即分配
8、不同的内存空间,而类变量不再重新分配,所有的对象共享类变量,即所有的对象的类变量是相同的一处内存空间,类变量的内空空间至于什么时候释放内存空间,这是大家想知道的,那么我告诉大家,类变量的内存空间直到程序退出运行,才会释放所占有的内存.其实说到这里,我们应该再随便说下类的方法,类的方法也分实例方法和类方法,那么有谁能告诉我实例方法和类方法有什么区别么?是这样的,类的实例方法是在只有类创建对象的时候才会被分配入口地址,而类方法,是当程序的字节码文件加载到内存就马上分配入口地址,这就是为什么实例方法可以调用类方法,而类方法不能调用实例方法的原因,也是类方法为什么不可以操作实例变量而实例方法可以操作类变量的原因(想想谁的入口地址先分配 ).那么有人会问 ,当我在创建一个对象的时候,实例方法和类方法是不是会被再次分配入口地址?其实不然,当你再创建一个对象时,实例方法是不会再分配入口地址的,也就是说,方法的入口地址是被所有对象共享的.类方法一开始就分配了入口地址,也不会再分配入口地址.讲到这里,也许有人还会问,那么方法的入口地址是什么时候才会被取消的呢?是这样的,类方法是直到程序退出运行才会被取消入口地址,而实例方法就不一样了,实例方法是当所有对象都不存在的时候,入口地址才被取消.