java语言中,根据定义变量的位置不同,可以将变量分成两大类:成员变量和局部变量。成员变量和局部变量的运行机制存在较大的差异。
成员变量指的是在类里定义的变量,局部变量指的是在方法里定义的变量,成员变量被分为类变量和实例变量两种,定义成员变量时没有static修饰的就是实例变量,有static修饰的就是类变量。其中类变量从该类的准备阶段开始存在,直到系统完全销毁这个类,类变量的作用域与这个类的生存范围相同,而实例变量则从该类的实例被创建起开始存在,直到系统完全销毁这个实例,实例变量的作用域与对应实例的生存范围相同。
正是基于这个原因,可以把类变量和实例变量统称为成员变量,其中类变量可以理解为类成员变量,它作为类本身的一个成员,与类本身共存亡;实例变量则可理解为实例成员变量,它作为实例的一个成员,与实例共存亡。
只要类存在,程序就可以访问该类的类变量。
只要实例存在,程序就可以访问该实例的实例变量。
类变量也可以让该类的实例来访问
但由于这个实例并不拥有这个类变量,因此它访问的并不是这个实例的变量,依然是访问它对应类的类变量。如果通过一个实例修改了类变量的值,由于这个类变量并不属于它,而是属于它对应的类,因此,修改的依然是类的类变量,与通过该类来修改类变量的结果完全相同,这会导致该类的其他实例来访问这个类变量时也将获得这个被修改过的值。
局部变量根据定义形式的不同,又可以被分为如下三种
形参:在定义方法签名时定义的变量,形参的作用域在整个方法内有效。
方法局部变量:在方法体内定义的局部变量,这个局部变量的作用域从定义该变量的地方生效,到该方法结束时失效
代码块局部变量:在代码块中定义的局部变量,这个局部变量的作用域从定义该变量的地方生效,到该代码块结束时失效。
与成员变量不同的是,局部变量除了形参之外,都必须显示的初始化。也就是说,必须先给方法局部变量和代码块局部变量指定初始值。
形参的作用域是整个方法体内有效,而且形参也无需显式初始化,形参的初始化在调用该方法时由系统完成,形参的值由方法的调用者负责指定。