`
i学霸
  • 浏览: 12745 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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
使用范围:至少是当前类
在内存中的位置:堆中的对象内

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics