智渔课堂官方免费教程九:Java基础之成员变量(全局变量)和局部变量

时间:2022-11-22 19:25:25

全局变量和局部变量

全局变量(也叫属性)

直接写在类中,使用范围是整个类;在创建对象时被创建,存储在堆内存中的对象里,有默认的初始值(整型:0  浮点型:0.0  布尔型:false  字符型:ASCII码为0的值  引用类型:null)

局部变量

写在方法中或者方法的参数,使用时才被创建,所以没有初始值;必须先初始化(第一次赋值),才能使用。
基本数据类型的局部变量:直接将值存储在栈中的方法栈帧里;
引用数据类型的局部变量:栈中的方法栈帧里存储的是关键字new在堆中创建的对象的地址
简单的说,基本数据类型直接存储常量值,引用数据类型存储的是对象的内存地址
注意:String是引用类型,而且有常量值。
例如:
//当使用字符串常量“abc”赋值时,系统会先去常量池中查找有没有字符串abc
//如果有,将找到的字符串常量“abc”的内存地址赋值给变量s1
//如果没有,先将常量“abc”放入常量池,并将“abc”在常量池中的内存地址赋值给s1
String  s1 = “abc”;
//此句代码使用关键字new创建了String类型的对象,所以这里的字符串abc是保存在堆中创建的对象里的;然后将对象在堆中的内存地址赋值给变量s2
String  s2 = new String(“abc”); 
使用范围:
方法内部的局部变量,自声明处开始,至左边最近的的左大括号所对应的右大括号结束;
方法的参数:整个方法。
全局变量和局部变量可以重名,因为他们一个在堆中一个在栈中;全局变量和全局变量、局部变量和局部变量不能重名。
实例:
/**
* 演示全局变量和局部变量
* @author 学霸联盟 - 赵灿
*/
public class PropertyDemo {
/*
* 以下声明了9种不同类型的全局变量(属性)
* 都存储在堆内存中,所以全局变量之间不能同名
*/
byte b;
short s;
int i;
long l;
float f;
double d;
char c;
boolean bool;
String str;
//main方法
public static void main(String[] args) {
/*
* 以下声明了9种不同类型的局部变量
* 都存储在栈内存中,所以局部变量之间也不能同名
* 但是由于局部变量和全局变量存储在不同的内存空间中
* 所以局部变量和全局变量之间可以同名
*/
byte b;
short s;
int i;
long l;
float f;
double d;
char c;
boolean bool;
String str;
//pd也是一个局部变量
PropertyDemo pd = new PropertyDemo();
//这里直接输出属性的默认值
System.out
.println(pd.b + "," + pd.s + "," + pd.i + "," + pd.l + ","
+ pd.f + "," + pd.d + "," + pd.c + "," + pd.bool + ","
+ pd.str);
/*
* 这里无法这样直接输出局部变量,局部变量必须初始化以后才能使用
System.out.println(b +","+ s + ","+ i +","+ l +","+ f +"," + d
+ "," + c + "," + bool + "," + str);

*/
//初始化局部变量
b = 1;
s = 1;
i = 1;
l = 1;
f = 1F;
d = 1;
c = '1';
bool = true;
str = "";
System.out.println(b +","+ s +"," + i +","+ l +"," + f + "," + d
+ "," + c + "," + bool + "," + str);
}
}
运行结果:
0,0,0,0,0.0,0.0,,false,null
1,1,1,1,1.0,1.0,1,true,

注意:char类型的默认值是空,不是空格;String类型认值是null,而""代表的是空字符串


小结:

全局变量:
编写位置:直接写类中
        默认值:有;整型:0、浮点型:0.0、boolean:false、char:ascii码为0的值、引用类型:null
使用范围:至少是当前类
在内存中的位置:堆中的对象内

局部变量:
编写位置:写在方法中
默认值:没有;必须要初始化之后才可以使用
使用范围:根据变量所在的大括号确定
在内存中的位置:栈中的方法栈帧中