很多人在刚开始学习编程时,都会被全局变量和局部变量搞得头晕脑胀。我对此从以下方面进行区分;
学习之前必须了解的基础知识
-
局部变量(Local Variable):定义在函数体内部的变量,作用域仅限于函数体内部。离开函数体就会无效。
-
全局变量(Global Variable):所有的函数外部定义的变量,它的作用域是整个程序,也就是所有的源文件
一、定义的位置
- 局部变量:定义在方法内部;
- 全局变量:直接写在类当中;
public class Student{
private int age;//全局变量
public String name;//全局变量
public test() {
int num;//局部变量
}
}
二、作用的范围
- 全局变量:整个类都可以使用;
- 局部变量:只能在定义他的方法里面使用,出了方法就不能使用;
public class Student{
private int age;//全局变量
public String name;//全局变量
public test() {
int num;//局部变量
//局部变量只能在当前方法里使用;但是全局变量可以在该类里任何地方使用;
System.out.println(this.age + num);
}
public test2() {
//全局变量的使用;上面方法的num不能在当前方法中使用,因为他是局部变量
System.out.println(this.age + " : " + this.name);
}
}
三、默认值
- 全局变量:有默认值;
如果是整数 : 默认是0;
如果是浮点数 :默认是0.0;
如果是字符 :默认是“\u0000”;
如果是布尔 :默认是false;
如果是引用类型 :默认是null; - 局部变量:没有默认值;
注意:局部变量没有默认值,如果想使用必须手动进行赋值;在Java里面,局部变量如果不进行赋值,那么在使用时就会报错;
public class Student{
private int age;//全局变量,有默认值0;
public String name;//全局变量,有默认值null;
public test() {
int num = 0;//局部变量,没有默认值,所以必须手动赋值;
//如果没有对num进行手动赋值,那么在下面使用时就会报错;
Sysout.out.println(num + 2);
}
}
- 没有对age进行手动赋值,所以在使用时就会报错;
- 进行手动赋值后,错误就会消失;
四、内存位置
-
局部变量:位于栈内存;这里也就解释清楚了为什么局部变量只能在他所在的方法区里面使用;原因就是,方法运行需要进栈,进栈后该方法的局部变量才会存在,而当该方法运行完成后就需要出栈,出栈之后局部变量也就跟着一起消失。
-
全局变量:位于堆内存;程序在运行时,就会将该类的class文件加载进来,从而该类里面的全局变量也就会随之被加载进来,所以只要class文件存在,那么该全局变量就存在。这就是为什么全局变量可以在整个类中起作用;
五、生命周期
- 局部变量:随着方法进栈而产生的,随着方法出栈而消失;所以局部变量的存活时间和该方法有关;
- 全局变量:随着对象的创建而出现,随着垃圾回收机制的回收而消失;所以全局变量的存活时间和垃圾回收机制的运行有关;