1 成员变量、局部变量和静态变量
成员变量:在类中且在方法外定义的变量称为成员变量;
局部变量:方法中、方法的形参或代码块中定义的变量,都属于局部变量;
静态变量:如果一成员变量有static关键字修饰,则该变量被称为静态变量。
成员变量 | 局部变量 | 静态变量 | |
---|---|---|---|
定义位置 | 类中,方法外 | 方法中、方法的形参或代码块内 | 类中,方法外 |
初始化值 | 有默认初始化值 | 无,先定义,赋值,最后使用 | 有默认初始化值 (类初次加载时进行初始化) |
调用方式 | 对象调用 | — | 对象调用,类名调用 |
存储位置 | 堆 | 栈 | 方法区 |
生命周期 | 与对象共存亡 | 与方法共存亡 | 与类共存亡 |
别名 | 实例变量 | — | 类变量 |
2 静态变量的特点及注意事项
1 特点
- 有static修饰符;
- 随着类的加载而加载,优先于对象存在;
- 可以直接被类名调用,即多了一种调用方式:类名.静态变量;
- 其内存空间对所有该类的实例是共享的,实现了数据共享。
2 注意事项
- 如果变量是对象特有的,不应当被静态修饰。因为那样的话,特有变量会变成对象的共享变量,这样对事物的描述就出了问题。因此,在定义静态时,必须要明确,该变量是否是被对象所共享的。
- 静态方法只能访问静态成员(包括静态方法、静态变量、静态代码块),不可以访问非静态成员。因为静态方法加载时,先于对象存在,所以没有办法访问对象中的成员。
- this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
3 什么情况下使用静态变量
静态变量实现了内存共享,节省了内存开销,但由于其生命周期太长,不易被回收,使用不合理反而会造成内存浪费,因此建议在满足以下条件时使用。
- 变量所在对象体积较大,占用内存较多;
- 变量所在对象生命周期较长;
- 变量所在对象数据稳定;
- 该类的实例有对该变量的共享需求。
3 总结
- 如果一个变量能够用来描述一个类的属性,就定义为成员变量;
- 如果一个变量应被所有对象共享,就把这个变量用static来修饰,即为静态变量;
- 否则就定义为局部变量。