有个类public class StaticTest {
private static int id=0;
public void go() {
System.out.println(id++);
}
}
里面有个静态属性id,
另外一个类:public class Test {
public static void main(String[] args) {
for(int i=0;i<5;i++){
new StaticTest().go();
}
}
}为什么输出时0,1,2,3,4?虽然说静态的属性石公用,但重新创建new对象后为什么还会一直增加?static

解决方案 »

  1.   

    static修饰的id在所有对象有只有一份,但并不是不变的,for循环调用了5次StaticTest().go()方法,也就是你的id++调用了4次。也就是将公用的那个static id 变成了4,所以你输出结果就是 0 1 2 3 4。如果你想不变的话,加上final。
      

  2.   

    但我每次都重新new了一个对象呀,为什么id还是在原来的基础上呢,是说这个类加载的时候这个id属性就已经存在了的原因吗?
      

  3.   

    个人理解:
    静态属性第一次new 对象时创建,以后再new 对象时不再创建,共用第一次创建的那个。
      

  4.   

    你每次都new了一个 new StaticTest
      

  5.   

    是的,
    第一次循环刚刚开始的时候,StaticTest这个类的对象,也就是StaticTest.class,首先被加载到内存中,其中包含该类所有的静态变量,然后StaticTest这个类的实例才产生,所以每次增加都是增加在同一个id属性上
      

  6.   

    简单的理解 对于非静态的 你每new 一次 系统就要为它分配内存,对于静态的你new 完之后它就一直在那里,你可以把静态的理解成老婆 ,非静态的话 你懂得
      

  7.   

    你new一次,关static属性什么事?它是独立于对象的,可以算得上类共享的。
      

  8.   

    静态属性是放在内存中占一席之地的,第一次new对象,id就指向了这块内存,再new对象的时候 ,不会清空这块内在,所以对id的修改都会影响这块内存
    id++是先取id,后执行++操作,所以输出结果会从0开始
      

  9.   

    static属性是类属性,由这个类创建的所有对象共享这个变量,它只在类加载时初始化一次。
    题中创建了5个对象(new了5次)每创建一次对象修改一次id值。。