美文网首页
成员变量、局部变量、静态变量、实例变量

成员变量、局部变量、静态变量、实例变量

作者: lbcBoy | 来源:发表于2020-05-13 17:55 被阅读0次

    成员变量 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
    解释:类中的静态变量其内存空间对所有该类的实例是共享的
    

    相关文章

      网友评论

          本文标题:成员变量、局部变量、静态变量、实例变量

          本文链接:https://www.haomeiwen.com/subject/rujwnhtx.html