成员变量和局部变量是两种不同的变量类型,它们有以下几个主要区别:
-
定义位置不同
- 成员变量定义在类的内部,方法外部。
- 局部变量定义在方法、构造器或者代码块中,是在⽅法中定义的变量或是⽅法的参数。
-
作用域不同
- 成员变量的作用域为整个类。
- 局部变量的作用域仅限于定义它的方法、构造器或代码块内部。
-
生命周期不同
- 成员变量是对象的⼀部分,成员变量的生命周期是随着对象的创建而创建,随着对象的消亡而消亡。
- 局部变量随着⽅法的调⽤⽽⾃动消失,局部变量的生命周期仅限于方法的执行过程,方法执行完毕后,局部变量将会被销毁。
-
默认值不同
- 成员变量有默认值,不同数据类型的默认值不同。
- 局部变量没有默认值,必须先显式赋值,否则编译器会报错。
- 成员变量如果没有被赋初值 :则会 ⾃ 动以类型的默认值 ⽽ 赋值( ⼀ 种情况例外 :被 final 修饰的成员变量也必须显式地赋值), ⽽ 局部变量则不会 ⾃ 动赋值。
-
内存分配位置不同
- 成员变量在堆内存中分配空间。
- 局部变量在栈内存中分配空间。
- 对象存于堆内存,如果局部变量类型为基本数据类型,那么存储在栈内存,如果为引 ⽤ 数据类型,那存放的是指向堆内存对象的引 ⽤ 或者是指向常量池中的地址。
-
修饰符不同
- 成员变量可以使用访问修饰符(public、protected、private)来控制其访问权限。 如果成员变量是使 ⽤ static 修饰的,那么这个成员变量是属于类的,如果没有使⽤ static 修饰,这个成员变量是属于实例的。
- 局部变量不能使用访问修饰符及 static 所修饰。
- 但是,成员变量和局部变量都能被final 所修饰。
- 成员变量可以使用访问修饰符(public、protected、private)来控制其访问权限。
-
线程安全性不同
- 成员变量在多线程环境下需要考虑线程安全问题。
- 局部变量由于其生命周期有限,一般不需要考虑线程安全问题。
总的来说,成员变量属于类的一部分,它们描述了对象的状态和特征;而局部变量是在方法执行过程中使用的临时变量,用于存储临时数据。正确理解和使用这两种变量类型对于编写高质量的代码非常重要。