I学霸官方免费教程九:Java基础之成员变量(全局变量)和局部变量
全局变量和局部变量
全局变量(也叫属性)
直接写在类中,使用范围是整个类;在创建对象时被创建,存储在堆内存中的对象里,有默认的初始值(整型: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
使用范围:至少是当前类
在内存中的位置:堆中的对象内
局部变量:
编写位置:写在方法中
默认值:没有;必须要初始化之后才可以使用
使用范围:根据变量所在的大括号确定
在内存中的位置:栈中的方法栈帧中
版权声明:本文为博主原创文章,未经博主允许不得转载。