成员变量与局部变量
成员变量:在类体中定义的变量为成员变量,作用范围(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方法无法识别,因为是静态方法只能访问静态域,无法访问非静态域,虽然是在最后声明的,但是能够被访问,因为它的作用域是整个类。
规则:一般而言,所有变量都遵循“先声明,后使用”的原则,只有先声明了,变量才能在内存中存在,之后才能被其他方法去访问。但是,存在于类中成员变量(不在任何的方法中),其作用域是整个类的范围,在编译器的内部协调下,变量只要作为类中的数据成员被声明,就可以在类内部的任何地方使用,无需满足“先声明,后使用”的原则。