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