Java中的成员变量与局部变量
成员变量就是在类中声明的变量,也称为实例变量,它们存储在堆内存当中,可以被类的所有方法访问。 局部变量就是在方法、构造函数或代码块中定义的变量,只能在其所属的作用域内使用,它们存储在栈内存中,当其所属的方法执行完毕后就会被销毁。
1.成员变量
成员变量分为静态变量和实例变量两种。 类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则为对象私有,某一个对象将其值改变,不影响其他对象。
静态变量(类变量)
静态变量是被 static 修饰的,它从该类的准备阶段就存在了,直到系统销毁这个类,静态变量的作用域与这个类的生存范围相同;
static String name; //静态变量
访问方法:
- 类.静态变量:
Student.name="张三";
System.out.println(Student.name);//输出:张三
- 实例.静态变量(不推荐):
Student s1=new Student();
Student s2=new Student();
//一般不推荐这样引用静态成员变量:
可以在类的多个方法中共享数据,提高代码的灵活性和复用性。
对象的状态可以通过成员变量来描述和记录。
局部变量:
节省内存空间,避免长时间占用内存。
提供了临时存储数据的功能,方便控制程序流程。变量
s1.name="amber";
s2.name="doris";
System.out.println(s1.name);//输出的是doris,因为两个实例指向的是同一个静态变量
实例变量
实例变量没有 static 修饰,它从该类的实例被创建时就存在,直到系统销毁这个实例,实例变量的作用域与对应实例的生存范围相同
int age;//实例变量
访问方法:
- 实例.实例变量:
Student s1=new Student();
Student s2=new Student();
s1.age=15;
s2.age=18;
System.out.println(s1.age); //输出:15
System.out.println(s2.age); //输出:18
2.局部变量
局部变量仅作用在局部区域中,从定义开始到大括号或者 return 结束,生命周期短。局部变量可以先定义再初始化,也可以定义的同时初始化,局部变量没有默认初始值,必须要初始化值后才能使用。
错误示例:
public void test(){
int height;//局部变量
System.out.println(height);//报错,此时height变量并没有初始化
}
修改后代码:
public void test(){
int height=185;//局部变量
System.out.println(height);//height有初始值,故输出185
}
成员变量和局部变量的位置对比
public class Student {
static String name; //类变量
int age; //实例变量
public void test(){
int height; //成员变量
height=180;
System.out.println(height);
}
}
3.成员变量和局部变量区别大总结
区别 | 成员变量 | 局部变量 |
---|---|---|
作用域 | 整个类 | 在其所属的方法、构造函数或代码块内 |
存储位置 | 堆内存 | 栈内存 |
生命周期 | 与对象相同,当对象被销毁时才会释放 | 仅限于其所属方法、构造函数或代码块的执行期间 |
类中声明的位置 | 类中方法外 | 通常在方法中 |
默认值 | 有默认初始值(如 int 类型为 0) | 没有默认初始值,必须初始化后才能使用 |
4.两者使用的注意事项
成员变量的注意事项
- 应该根据需求选择合适的访问修饰符(如 private、protected、public)来控制其可见性。
- 需要考虑线程安全问题,可以使用 synchronized 关键字或其他同步机制进行保护。
局部变量的注意事项
- 在使用前必须显式初始化,否则会编译错误。
- 不同的方法中可以使用相同名称的局部变量,但不会产生冲突,因为它们具有不同的作用域。
成员变量可以在类的多个方法中共享数据,提高代码的灵活性和复用性,对象的状态可以通过成员变量来描述和记录。局部变量节省内存空间,避免长时间占用内存,提供了临时存储数据的功能,方便控制程序流程。二者都是 Java 中常用的变量类型,合理使用它们可以更好地管理我们的数据和程序流程。
转载自:https://juejin.cn/post/7376537482316218407