黑马程序员技术交流社区

标题: 请问静态变量和实例变量怎么区别呢?他们都怎么使用? [打印本页]

作者: dongyangzhang    时间: 2013-6-9 18:33
标题: 请问静态变量和实例变量怎么区别呢?他们都怎么使用?
本帖最后由 dongyangzhang 于 2013-6-10 15:38 编辑

复制代码
public class VariantTest{
         public static int staticVar = 0;
         public int instanceVar = 0;
         public  VariantTest(){
                  staticVar++;
                  instanceVar++;
                  System.out.println("staticVar=" + staticVar + ",instanceVar=" + instanceVar);
         }
        public static void main(String[] args){

}
}
这些代码有点不很明白,怎么打印出来?


作者: 袁梦希    时间: 2013-6-9 18:53
楼主你好

  1. <P> public class VariantTest{
  2.          public static int staticVar = 0;
  3.          public int instanceVar = 0;
  4.          public  VariantTest(){
  5.                   staticVar++;
  6.                   instanceVar++;
  7.                   System.out.println("staticVar=" + staticVar + ",instanceVar=" + instanceVar);
  8.          }
  9.          public static void main(String[] args){</P>
  10. <P>                   new VariantTest();//创建对象进行初始化
  11.          }
  12. }</P>
复制代码
public  VariantTest(){
                  staticVar++;
                  instanceVar++;
                  System.out.println("staticVar=" + staticVar + ",instanceVar=" + instanceVar);
                  }

因为这句话是定义的构造函数,所以需要创建对象来对其进行初始化,所以可以new的方式让构造方法里的值打印出来。

作者: 武志红    时间: 2013-6-9 19:18
先上代码:
  1. public class VariantTest{
  2.          public static int staticVar = 0;
  3.          public int instanceVar = 0;
  4.          public  VariantTest(){
  5.                   staticVar++;
  6.                   instanceVar++;
  7.                   System.out.println("staticVar=" + staticVar + ",instanceVar=" + instanceVar);
  8.          }
  9.         public static void main(String[] args){
  10.                 new VariantTest();
  11.                 new VariantTest();
  12.                 new VariantTest();
  13.         }
  14. }
复制代码
你把它写在构造方法里面,那么你你在调用构造方法的时候就执行了你面的打印语句。我在此创建了三个对象,打印出来的结果是这样的:
staticVar=1,instanceVar=1
staticVar=2,instanceVar=1
staticVar=3,instanceVar=1
你可以看到静态变量是递增的,而实列变量是不会增加的,这是为什么呢?其实,静态变量又叫做类变量,它在一个进程中只有一个,它不属于任何一个实例对象,所有的对象去共享它。它是在类的字节码被加载的时候被初始化的。而实例变量是每个对象都有一个的。
因此,关于上面的结果,当VariantTest类的字节码被载入的时候,就在内存中开了一个空间存放着staticVar=0,之后在main方法中每new一次,staticVar加1之后被打印出来,就是1,2,3。而instanceVar在每次new的时候都开了新的空间存放了instanceVar=0,加1之后打印出来,也就打印出3个1。
作者: 李征    时间: 2013-6-9 22:32
简单的说,首先,静态变量在类被加载的时候,就已经存在于方法区中了,在类被释放以后,这个静态变量也就消失了,所以静态变量也叫,类变量,生命周期最长。
静态变量出现的初衷是为了节约资源,把所有可以共享的数据存放在一个可以被共享的区域里,也就是方法区,可以被所有的对象所访问,如果没有静态变量,那么所有的变量包括重复的,不重复的都会在对象被NEW出来的同时也被NEW出来,这样极大占用了堆内存中的空间。
而实例变量,必须是在创建对象的时候,才会出现在堆内存中,如果不创建对象,那么实例变量就不存在,每当NEW一个对象的时候,这个实例变量也会同时被NEW出来,也就是每次实例变量都是初始化的值。
看懂了上面的,就很好理解你的代码里的问题了,在类被加载的同时,静态变量staticVar就已经存在,并且在类消失之前一直存在,而实例变量instanceVar在每次对象被创建时都会被新建(在堆内存中又开辟了一个空间来存放这个对象并对其初始化)一次,所以这个instanceVar是不可能递增的。
字有点多,希望能帮到你。
作者: 孔雀东南飞    时间: 2013-6-10 12:16
public class VariantTest{
         public static int staticVar = 0;//定义静态成员,其在类加载时就存在了,不依靠VariantTest来调用。
         public int instanceVar = 0;//定义非static成员,只有VariantTest的对象才能调用
         public  VariantTest(){//重载构造函数,在创建类的对象时调用此函数
                  staticVar++;
                  instanceVar++;
                  System.out.println("staticVar=" + staticVar + ",instanceVar=" + instanceVar);
         }
        public static void main(String[] args){

}
}

楼主,关于这个问题你要清楚几个知识点:
1、构造函数名与类名一致,当创建类的实例的时候,默认调用空参数构造函数;如果没有空参数构造函数,必须手动调用带参数的构造函数。
2、用static 修饰的成员,在类加载的时候就加载了,不依赖于对象;而非static的成员是依赖于对象存在的,也就是说只有创建了对象才能调用非static成员。

作者: 夜默    时间: 2013-6-10 12:19
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。{:soso_e195:}
作者: dongyangzhang    时间: 2013-6-10 15:37
巩建 发表于 2013-6-10 12:19
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。 ...

嗯嗯好的




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