成员变量与局部变量

成员变量:在类体中定义的变量为成员变量,作用范围(scope)是整个类,只要在这个类中都可以访问到它。

局部变量:在一个方法或方法中的代码块(code block)中定义的变量。局部变量是在方法或代码块被执行的时候被创建,在方法或代码块结束时被销毁。局部变量在进行取值操作前必须被初始化或赋值,否则出现编译错误。

如下程序综合了变量的应用:


package com.liaojianya.chapter1;
/**
 * This program demonstrates the difference between local variables and member variables
 * @author LIAO JIANYA
 *
 */
public class TestLocalVar4_5
{
	public static void main(String[] args)
	{
		int outer = 1;
		{
			int inner = 2;
			System.out.println("inner = " + inner);
			System.out.println("outer = " + outer);
		}
//		System.out.println("inner = " + inner);
		int inner = 3;
		System.out.println("inner = " + inner);
		System.out.println("outer = " + outer);
		
		System.out.println("In class, the member a = " + a);
	}
	
	static int a = 123;

}


 运行结果:


inner = 2
outer = 1
inner = 3
outer = 1
In class, the member a = 123


总结:块(block)作用范围除了用for(while)循环或方法体的左右花括号{}来界定外,还可以直接用花括号{}来定义块。

1)在上述程序中,块内定义inner为2,所以第一次打印出来的inner = 2.出了块后,若取消注释符号//,会出现编译错误,原因是这个语句不认识名叫“inner”的变量,因为前一个inner是定义在块内,出了块,块内inner将对后面的语句无效。之后,又重新定义一个inner变量并赋值为3,所以之后打印出来为inner = 3。

2)从程序结果可以看出,outer = 1一直适用,因为是定义在块外的变量并且已经被赋值为1,块内快外都是可以调用.

3)对于主方法块外的static int a = 123;是属于成员变量,必须声明为static的,否则main方法无法识别,因为是静态方法只能访问静态域,无法访问非静态域,虽然是在最后声明的,但是能够被访问,因为它的作用域是整个类。

规则:一般而言,所有变量都遵循“先声明,后使用”的原则,只有先声明了,变量才能在内存中存在,之后才能被其他方法去访问。但是,存在于类中成员变量(不在任何的方法中),其作用域是整个类的范围,在编译器的内部协调下,变量只要作为类中的数据成员被声明,就可以在类内部的任何地方使用,无需满足“先声明,后使用”的原则。