成员变量/局部变量
1.定义位置不同,成员变量定义在类里,局部变量定义在类的方法里。
来自网络
2.成员变量中,其中类变量从该类的准备阶段起开始存在,直到系统完全销毁这个类,类变量的作用域与这个类的生存范围相同,一个类在使用之前要经过类加载、类验证、类准备、类解析、 类初始化等几个阶段;而实例变量则从该类的实例被创建起开始存在,直到系统完全销毁这个实例,实例变量的作用域与对应实例的生存范围相同。
正是基于这个原因,可以把类变量和实例变量统称为成员变量,其中类变量可以理解为类成员变量,它作为类本身的一个成员,与类本身共存亡;实例变量则可理解为实例成员变量,它作为实例的一个成员,与实例共存亡。
3.关于初始化,成员变量无须显式初始化,只要为一个类定义了类变量或实例变量,系统就会在这个类的准备阶段或创建该类的实例时进行默认初始化,成员变量默认初始化时的赋值规则与数组动态初始化时数组元素的赋值规则完全相同。
4.局部变量根据定义形式的不同,又可以被分为如下三种:
–形参:在定义方法签名时定义的变量,形参的作用域在整个方法内有效。当通过类或对象调用某个方法时,系统会在该方法栈区内为所有的形参分配内存空间,并将实参的值赋给对应的形参,这就完成了形参的初始化。
–方法局部变量:在方法体内定义的局部变量,它的作用域是从定义该变量的地方生效,到该方法结束时失效。
–代码块局部变量:在代码块中定义的局部变量,这个局部变量的作用域从定义该变量的地方生效,到该代码块结束时失效。
与成员变量不同的是,局部变量除形参之外,都必须显式初始化。也就是说,必须先给方法局部变量和代码块局部变量指定初始值,否则不可以访问它们。
变量的使用规则:
对Java初学者而言,何时应该使用类变量?何时应该使用实例变量?何时应该使用方法局部变量?何时应该使用代码块局部变量?
这种选择比较困难,如果仅就程序的运行结果来看,大部分时候都可以直接使用类变量或者实例变量来解决问题,无须使用局部变量。但实际上这种做法相当错误,因为定义一个成员变量时,成员变量将被放置到堆内存中,成员变量的作用域将扩大到类存在范围或者对象存在范围,这种范围的扩大有两个害处。
1.增大了变量的生存时间,这将导致更大的内存开销。
2.扩大了变量的作用域,这不利于提高程序的内聚性。
局部变量有应用场景,成员变量呢?如果有如下几种情形,则应该考虑使用成员变量:
1.如果需要定义的变量是用于描述某个类或某个对象的固有信息的,例如人的身高、体重等信息,是人对象的固有信息,每个人对象都具有这些信息。这种变量应该定义为成员变量。
再进一步,如果这种信息对这个类的所有实例完全相同,或者说它是类相关的,例如人类的眼睛数量,目前所有人的眼睛数量都是2,如果人类进化了,变成了3个眼睛,则所有人的眼睛数量都是3, 这种类相关的信息应该定义成类变量;
如果这种信息是实例相关的,例如人的身高、体重等,每个人实例的身高、体重可能互不相同,这种信息是实例相关的,因此应该定义成实例变量。
2.如果在某个类中需要以一个变量来保存该类或者实例运行时的状态信息,例如五子棋程序中的棋盘数组,用以保存五子棋实例运行时的状态信息。这种用于保存某个类或某个实例状态信息的变量通常应该使用成员变量。
3.如果某个信息需要在某个类的多个方法之间进行共享,则这个信息应该使用成员变量来保存。例如,在把浮点数转换为人民币读法字符串,数字的大写字符和单位字符等是多个方法的共享信息,因此应设置为成员变量。
即使在程序中使用局部变量,也应该尽可能地缩小局部变量的作用范围,局部变量的作用范围越小,它在内存里停留的时间就越短, 程序运行性能就越好。因此,能用代码块局部变量的地方,就坚决不要使用方法局部变量。