成员变量 vs 局部变量
成员变量在类中定义,可以在类里面使用;
局部变量在方法内定义,可以在方法内部使用;
成员变量存在堆中,随着对象创建在诞生,随着对象被回收而消失;
局部变量在栈中,随着方法进栈而诞生,方法出栈而消失;
静态变量 vs 实例变量(成员变量)
静态变量存储在方法区,属于类所有;
实例变量存储在堆当中,其引用存在当前线程栈;
需要注意的是从JDK1.8开始用于实现方法区的PermSpace被MetaSpace取代了.
1、生命周期的不同:
成员变量随着对象的创建而存在随着对象的回收而释放。
静态变量随着类的加载而存在随着类的消失而消失。
2、调用方式不同:
成员变量只能被对象调用。
静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)
3、别名不同:
成员变量也称为实例变量。
静态变量称为类变量。
4、数据存储位置不同:
成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
静态变量的使用
在程序运行期间, * 类中的静态变量其内存空间对所有该类的实例是共享的 *,
因此在某些时候,为了节省内存空间开销,共享资源,我们可以将类中的变量声明为静态变量。
但是因为静态变量生命周期太长,并且不易被系统回收,所有如果使用不合理,就会适得其反,从而造成大量内存的浪费。
因此建议在全部符合下列条件的情况下才使用静态变量:
(1)变量所包含的对象体积较大,占用内存较多
(2)变量所包含的对象生命周期较长
(3)变量所包含的对象数据稳定
(4)该类的实例有对该变量包含对象的共享需求
public class HasStatic{
private static int x=100;
public static void main(String args[]){
HasStatic hs1=new HasStatic();
hs1.x++;
HasStatic hs2=new HasStatic();
hs2.x++;
hs1=new HasStatic();
hs1.x++;
HasStatic.x--;
System.out.println("x="+x);
}
}
结果应该是:102
解释:类中的静态变量其内存空间对所有该类的实例是共享的
网友评论