六、再谈变量 1.实例变量和局部变量 在方法外定义的变量主要是实例变量(不带static 修饰的),它们是在使用new Xxxx ()创建一个对象时被分配内存空间的。每当创建一个对象时,系统就为该类的所有实例变量分配存储空间;创建多个对象就有多份实例变量。通过对象的引用就可以访问实例变量。 在方法内定义的变量或方法的参数被称为局部(local)变量,有时也被用为自动(automatic)、临时(temporary)或栈(stack)变量。 方法参数变量定义在一个方法调用中传送的自变量,每次当方法被调用时,一个新的变量就被创建并且一直存在到程序的运行跳离了该方法。 当执行进入一个方法遇到局部变量的声明语句时,局部变量被创建,当执行离开该方法时,局部变量被取消,也就是该方法结束时局部变量的生命周期也就结束了。 因而,局部变量有时也被引用为“临时或自动”变量。在成员方法内定义的变量对该成员变量是“局部的”,因而,你可以在几个成员方法中使用相同的变量名而代表不同的变量。该方法的应用如下所示: publicclass Test { privateint i; // Test类的实例变量 publicint firstMethod() { int j = 1; // 局部变量 // 这里能够访问i和j System.out.println("firstMethod 中 i="+i+",j="+j); return 1; } // firstMethod()方法结束 publicint secondMethod(float f) { //method parameter int j = 2; //局部变量,跟firstMethod()方法中的j是不同的 // 这个j的范围是限制在secondMethod()中的 // 在这个地方,可以同时访问i,j,f System.out.println("secondMethod 中 i="+i+",j="+j+",f="+f); return 2; } publicstaticvoid main(String[] args) { Test t = new Test(); t.firstMethod(); t.secondMethod(3); } } 2.变量初始化 在Java程序中,任何变量都必须经初始化后才能被使用。当一个对象被创建时,实例变量在分配内存空间时按程序员指定的初始化值赋值,否则系统将按下列默认值进行初始化:
注意── 一个具有空值null的引用不引用任何对象。试图使用它引用的对象将会引起一个异常。异常是出现在运行时的错误,这将在模块“异常”中讨论。 在方法外定义的变量被自动初始化。局部变量必须在使用之前做“手工”(由程序员进行)初始化。如果编译器能够确认一个变量在初始化之前可能被使用的情形,编译器将报错。 publicclass Test { privateint i; //Test类的实例变量 publicvoid test1() { int x = (int) (Math.random() * 100); int y; int z; if (x > 50) { y = 9; } z = y + x; // 将会引起错误,因为y可能还没有被初始化就使用了 } publicstaticvoid main(String[] args) { Test t = new Test(); t.test1(); } } 3.变量的范围(scope) Java变量的范围有四个级别:类级、对象实例级、方法级、块级。 (1)类级变量又称全局级变量,在对象产生之前就已经存在,就是后面会学到的static变量。 (2)对象实例级,就是前面学到的属性变量 (3)方法级:就是在方法内部定义的变量,就是前面学到的局部变量。 (4)块级:就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了。 示例如下: publicclass Test { private static String name="Java私塾";//类级 privateint i; // 对象实例级,Test类的实例变量 {//属性块,在类初始化属性时候运行 int j = 2;//块级 } publicvoid test1() { int j = 3;//方法级 if(j==3){ int k = 5;//块级 } //这里不能访问块级的变量,块级变量只能在块内部访问 System.out.println("name="+name+",i="+i+",j="+j); } publicstaticvoid main(String[] args) { Test t = new Test(); t.test1(); } } 运行结果: name=Java私塾,i=0,j=3 3.1访问说明 (1)方法内部除了能访问方法级的变量,还可以访问类级和实例级的变量 (2)块内部能够访问类级、实例级变量,如果块被包含在方法内部,它还可以访问方法级的变量。 (3)变量当然是要在被访问前被定义和初始化,不能访问后面才定义的变量。
Java私塾跟我学系列——JAVA篇 网址:http://www.javass.cn 电话:010-68434236 |