A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 自己玩 黑马帝   /  2012-7-1 22:16  /  2373 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 自己玩 于 2012-7-1 22:29 编辑

静态变量和实例变量的区别?求高手指尖

5 个回复

倒序浏览
本帖最后由 邵阳 于 2012-7-1 22:26 编辑

以前看过的问题做了备份,直接给你吧,这个也算是我总结的吧。

在java中,全局变量和成员变量是一个概念吗?
还有成员变量、全局变量、类变量、实例变量、局部变量他们之间的关系和联系是什么?

1.成员变量又分为:实例变量和类变量(又称“静态变量或全局变量”)


2.  实例变量当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存..

3.  成员变量具有缺省值(定义以后没有赋初值的话就会自动被赋予默认值)..
4.  局部变量则没有(局部变量如果没有初始化,它的值不可知),由声明在某方法,或某代码段里(比如for循环),执行到它的时候直接在栈中开辟内存并使用的。当局部变量脱离作用域,存放该作用域的栈指针,栈顶与栈底重合即为释放内存,速度是非常快的..
回复 使用道具 举报
1. 静态成员变量也称为类变量,它属于整个类,而且它多了一种调用方式直接用类名调用 , 实例变量,是被对象调用的,是所属具体对象的。
2、 静态成员变量是随着类的加载而加载的,也是随着类的消亡而消亡,生命周期与所属的类的生命周期一致,实例变量随着对象的加载而加载,随着对象的消失而消失。按对象的生命周期存在。
3.     静态成员变量存储在方法区的静态方法区中,实例变量存储对象所属堆内存中
4. 静态成员变量被所有的类对象所共享 而 实例变量是对象中的特有数据

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
谢谢,明白了
回复 使用道具 举报
静态变量和实例变量的区别
    1、所属不同
    静态成员变量也称为类变量,它属于整个类,而且它多了一种调用方式直接用类名调用。
    实例变量,是被对象调用的,是所属具体对象的。
    2、生命周期不同
    静态成员变量是随着类的加载而加载的,也是随着类的消亡而消亡,生命周期与所属的类的生命周期一致
    实例变量随着对象的加载而加载,随着对象的消失而消失。按对象的生命周期存在。
    3、存储位置不同
    静态成员变量存储在方法区的静态方法区中
    实例变量存储对象所属堆内存中
    4、共享不同
    静态成员变量被所有的类对象所共享
    实例变量是对象中的特有数据

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
我这样给你说吧。在java中成员变量有两种就是你上边所说的静态变量和实例常量
他们最主要的区别就在于静态变量是被static修饰的而实例常量则没有用static修饰
还有静态变量在内存中只有一个。在jvm加载类的时候就为static修饰的静态变量分配了对应的内存,可以被类的所有实例共享,它是可以直接通过类名直接去访问的。它的生命周期主要是取决于类的生命周期的
而实例常量是完全依靠于类的实例的,当类每一次类实例化的时候,jvm就会给会给每一个实例分配对应 的内存 ,它是出于堆内存中的,与静态变量有所不同的就是,它的生命周期是依靠于实例的生命周期的。
下边这几个例子是我自己写的可以帮助你理解
public class Test{
    int x=2;//这个就是实例常量不加static修饰
    public static void main(String args[]){
       int x=1;//出于方法内部定义的变量叫做局部变量,它的应用范围局限于本方法内部。
        System.out.println(x);//这个时候你打印出来的是方法内部定义的局部变量
//如果你想取到上边定义的实例常量的话,就需要通过类的实例去引用了
     Test t =new Test();//为Test创建实例,实例名为t
       System.out.println(t.x);//通过类的实例引用就可以得到类里边的实例常量了,这也就是实例常量的生命周期取决于类的实例周期的原因了

   }

}
上边是关于实例常量的一个小例子,下边是关于静态变量的例子
public class Test{
  static  int x=2;//只要在原有的基础上加static就是静态变量了
    public static void main(String args[]){
      System.out.println(x);//在没有定义局部变量之前我输出x的值这个时候的值就是上边定义的静态变量的值
       int x=1;//出于方法内部定义的变量叫做局部变量,它的应用范围局限于本方法内部。
        System.out.println(x);//这个时候你打印出来的是方法内部定义的局部变量
     System.out.println(Text.x)//在定义局部变量之后如果想用静态变量的话可以直接通过类名引用。当然也可以通过实例
   }

}
通过上边的例子,我相信能帮助你更好的理解 了,最后我再说一点就是static修饰的变量属于一个公共变量,就像我在上边所说的它的生命周期取决于类的生命周期,也就是无论是这个类的那个实例改变了它的值,那么其他实例的值也会随之改变,而实例常量则不会
在写一个简单的例子
public class Test{
      static  int x=1;
      int y=0;
    public static void main(String args[]){
        Test t=new Test();
       t.x=3;
      t.y=2;
      Test t1=new Test();
System.out.println(t.x);//结果是3
System.out.println(t.y);//结果是2
System.out.println(t1.x);//结果是3
System.out.println(t1.y);//结果是0



   }
}
从上边的例子我想你应该明白了其中的原因了吧!

评分

参与人数 1技术分 +3 收起 理由
刘蕴学 + 3

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马