黑马程序员技术交流社区

标题: 【已解决】静态变量和实例变量的区别 [打印本页]

作者: 黄树人    时间: 2012-9-21 22:35
标题: 【已解决】静态变量和实例变量的区别
本帖最后由 黄树人 于 2012-9-22 10:57 编辑

在书上看了一个例子,如下:
public class VariantTest

{

public static int staticVar = 0;

public int instanceVar = 0;

public VariantTest()

{

staticVar++;

instanceVar++;

System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);

}

}

无论创建多少个实例对象,永远都只分配了一个staticVar变量,
并且每创建一个实例对象,这个staticVar就会加1;
但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。

我不是很理解
对上面的话,我理解的是,staticVar是静态变量,就只在栈里面创建了一个变量,而其他new出来的全部都是在堆里面创建的
如果不是这样理解,那应当如何理解呢

作者: 尤圣回    时间: 2012-9-21 22:39
静态变量 有称为类变量 这个变量在内存中只会加载一次 而实例变量 每次都会加载
作者: 霍永刚    时间: 2012-9-22 01:13
1.实例变量一开始是不存在的,要new后,系统才给它分配内存,这时才能访问
2.静态变量是系统一开始就为它分配了内存,自然可以不用new,就可以访问了。

作者: 陈振兴    时间: 2012-9-22 01:51
static int staticVar 语句说明data为类变量,为一个类的共享变量,属于整个类。
staticVar++;的结果为1,此时 VariantTest.staticVar的结果也为1。
Static定义的是一块为整个类共有的一块存储区域,其发生变化时访问到的数据都时经过变化的。
其变量可以通过类名去访问:类名.变量名。与通过访问对象的编译时类型访问类变量为等价的。

实例变量就是我们一般用到的,int instanceVar=0。在类中为成员变量,方法中局部变量,这一类大体上一致。
作者: 张忠豹    时间: 2012-9-22 02:14
首先,楼主要清楚静态变量和实例变量的区别:
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

首先,值得一说的是,静态变量时存在于方法区的共享区的,它所属于类,随着类的加载而加载,被所有对象共享,
在此,就是所有的对象共享staticVar ,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1
作者: 翁鹏    时间: 2012-9-22 07:52
本帖最后由 翁鹏 于 2012-9-22 07:59 编辑

           静态变量也是基于抽象思想的。如果很多对象都同时共享一个属性,你就可以把这个属性抽出来,把它设置成静态的变量,有利于资源的利用率。
           因为类的实例变量在每次创建对象的时候都会在自己的对象中保存一个副本。也就是说你创N个对象,每个对象都有自己的实例变量副本,一共就有N个实例变量在内存,而静态变量在内存中只有一个,所有对象都共享它。
           所以,在你这个例子里你每创一个对象,你对象自己的实例变量副本 instanceVar+1,你再创一个对象,另一个对象的副本也+1,但这两个副本不是同一个,所以不会叠加,初始化都是1。
           而你的静态变量因为是共享的,只有一个,所以每创一个对象就+1一次,你创了N个对象,你的 staticVar = N。
            
public class VariantTest
{
      public static int staticVar = 0;
      public int instanceVar = 0;
      public VariantTest()
      {
            staticVar++;
            instanceVar++;
            System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
       }
}
  
作者: 张小龙    时间: 2012-9-22 09:13
静态变量是随着随着类的存在而存在,只有当类消失时才会消失,所以生命周期很长,并且应该是一个共享的变量。
你的静态变量放在构造函数中,所以只要一new对象,就会使静态变量加个1.
public VariantTest()
{
staticVar++;
instanceVar++;
System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
}
但是实例对象是跟类对象绑定的,每个类对象都有自己单独的实例对象,虽然名称都相等,但是却存储在不同的堆内存中。
静态变量应该是存储在一个共享池里面,因为也是public,所以用类名VariantTest.staticVar也可以访问。

希望我的回答对楼主能有些帮助。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2