有两个类
public class A{
   public static int c = 1;
}public class B{
    public static void main(String[] arg){
      System.out.println(A.c++);
   }}为什么每次运行B,都输出2,
按理说,每次输出的值不是一样的啊,每次输出应该2,3,4,5,6.....的啊?这是为什么?

解决方案 »

  1.   

    那在一个进程内,是不是所有classpath上面的所有类的静态属性都存储在内部中呢?
      

  2.   

    赞同楼上的,
    楼主再加一条System.out.println(A.c++);这样输出的值就会增加
      

  3.   

    java虚拟机动态加载应用需要的类,有些类在classpath范围中,但是实际运行中并没有加载,当然该类的属性不会出现在进程内了
      

  4.   

    所有的static 成员都是在class被加载的时候被初始化的,你每运行一次B,都会加载一次A,static成员都被重新初始化,所以就每次都是2
      

  5.   

    to jackxing(Jack) 
    你说:“java虚拟机动态加载应用需要的类,有些类在classpath范围中,但是实际运行中并没有加载,当然该类的属性不会出现在进程内了”照你这么说,一个类的static属性也只是在加载其所在的类之后才被存储到内存中的,是吗?可是你又说了,在一个进程内,static属性会存在的,static属性一旦改变了值,则整个进程内再次获取的static属性的值就是其改变后的值,这与你刚才说的不是有点矛盾吗?
    麻烦你再解释一下,
      

  6.   

    用static修饰的数据成员是不属于任何一个类的具体对象,而是属于类的静态数据成员。
    它被保存在类的内存的公共存储单元中,而不是保存在某个对象的内存区中。
    一个类的任何对象都可以访问它,因此,它的值会增加!!!
    这样说吧:
    static变量,是属于类的,也就是说类的任何对象都可以访问它并修改它,但修改后的结果还是共享的
      

  7.   

    噢!楼主的问题,其实在他的问的过程中已经告诉我们了,因为他第运行一次,类都进行一次初使化,那么i的值始终是1,这样执行的结果就是2了。如果在他初始化后,程序未结束的情况,再调用就会依次增加,而不要希望你程序结束了,static属性的变量还能保存你的值。那可是Staic内存做的事,或者说是硬盘所具有的功能吧。哈哈!
      

  8.   

    让你的System.out.println(A.c++);输出两次试试
      

  9.   

    首先更正 一下  首先输出的是1  
    因为每次都是初始化 所以一样了  再加个System.out.println(A.c++); 就OK   了  
    可以说明白原因了吧
      

  10.   

    static变量的存储机制是怎么样的?还希望大家进一步解释一下,
      

  11.   

    -_-!!这个不是static类型的概念啦你的理解没错,但是错在:你是“每次运行……” 运行一次后线程都退出了,你的所有变量,对象都没有了,那么下一次运行的程序跟你这一次运行的程序有什么关系呢?
      

  12.   

    静态变量是为类所有,但是,类有一个生命周期,就是从JVM载入类,到JVM停止运行。
    你每次运行你的程序都是在一个JVM中运行的,它载入你的类,然后程序退出,JVM停止,再运行,重复上述步骤。
    Done。
      

  13.   

    哈哈楼上很好的一个比喻..别骂我.....我用A 定义了一个static i=1;
    我再用B 定义了main(String[] arg){
                         System.out.println(A.i++);
                  }
    javac A.java
    javac B.java
    java B
    1为啥没有楼主说的那个2 《当然如果我添一行就有2了》 这样就证明static i 在JVM执行完-次后是不会保存数据?
      

  14.   

    你每次重新运行等于重新开始一次程序,程序运行之后怎么会把新的C值保存到A.CLASS文件里去呢?鹅的神哪救救我吧!你这个小程序能从内存跳到硬盘中去存新值就好了!
      

  15.   

    to 陈亮,
    但是如果按照你这么说的话,又会一个新的问题,
    你说:“类有一个生命周期,就是从JVM载入类,到JVM停止运行。”,
    如果我的应用程序在运行时,我设置的CLASSPATH如果指向的类路径包含的类很多很多,按你的说法,只要我的这些类被JVM载入了,那么类就会在内存中“生存”,对吗? 如果这样的话,时间长了,那内存还消耗得起?这个问题,麻烦你解释一下,
      

  16.   

    晕倒哦,进程结束时,所分配的内存空间就已经被回收了,包括static变量。下次启动进程重新分配,两个进程间使用独立的内存空间,互不相干。
      

  17.   

    楼上的说的也蛮有道理哦,
    那你解释一下,Tomcat WEB应用里面的类的静态数据为什么可以长久保存?那你说Tomcat WEB应用只是一个进程吗?
      

  18.   

    和static没有关系,进程不停止就会保存你要的结果。WEB应用里面也是一样的啊,如果服务停止了,分配的内存空间也会被回收。
      

  19.   

    楼上的说的也蛮有道理哦,
    那你解释一下,Tomcat WEB应用里面的类的静态数据为什么可以长久保存?那你说Tomcat WEB应用只是一个进程吗?
    ***********************************
    你说的长久保存存储在IE或者服务器的项目路径下了。。
      

  20.   

    louzhu: 我就纳闷了。
    你的结果怎么可能是2呢?结果是1。
      

  21.   

    但还是不知道static存储机制是怎么样的,
      

  22.   

    但还是不知道static存储机制是怎么样的,
      

  23.   

    Thinking in java,再看会书吧。
      

  24.   

    一个类的static属性也只是在加载其所在的类之后才被存储到内存中的
    用static修饰的数据成员是不属于任何一个类的具体对象,而是属于类的静态数据成员。
    它被保存在类的内存的公共存储单元中,而不是保存在某个对象的内存区中。
    一个类的任何对象都可以访问它,因此,它的值会增加!!!
      

  25.   

    楼主的输出结果是1,并且始终是1,
    改动程序为:
    public class B{
        public static void main(String[] arg){
    for(int i=1;i<=10;i++){
    System.out.println(++A.c);
    }
    System.out.println(++A.c);
    System.out.println(++A.c);
          
       }}
    就可以得到结果,
    分析原因:static 是在内存中直接分配一段内存,并将1存入,当B执行后结果还是1,改为++A.c后结果为2;再次执行B时有一次将内存中的c初始化,不打了累死了,自己找原因了。