日期:2014-05-20  浏览次数:20722 次

关于静态属性,有个地方搞不太懂
有个类
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

------解决方案--------------------
static修饰的id在所有对象有只有一份,但并不是不变的,

for循环调用了5次StaticTest().go()方法,

也就是你的id++调用了4次。

也就是将公用的那个static id 变成了4,

所以你输出结果就是 0 1 2 3 4。

如果你想不变的话,加上final。


------解决方案--------------------
静态的是公用的 你建多少个还是在这个变量上累加的 
------解决方案--------------------
个人理解:
静态属性第一次new 对象时创建,以后再new 对象时不再创建,共用第一次创建的那个。
------解决方案--------------------
静态属于类级别的,而不是对象级别的。
------解决方案--------------------
你每次都new了一个?new?StaticTest
------解决方案--------------------
引用:
引用:静态的是公用的 你建多少个还是在这个变量上累加的是说这个类加载的时候这个id属性就已经存在了的原因吗?

是的,
第一次循环刚刚开始的时候,StaticTest这个类的对象,也就是StaticTest.class,首先被加载到内存中,其中包含该类所有的静态变量,然后StaticTest这个类的实例才产生,所以每次增加都是增加在同一个id属性上
------解决方案--------------------
简单的理解 对于非静态的 你每new 一次 系统就要为它分配内存,对于静态的你new 完之后它就一直在那里,你可以把静态的理解成老婆 ,非静态的话 你懂得
------解决方案--------------------
静态属性是放在内存中占一席之地的,第一次new对象,id就指向了这块内存,再new对象的时候 ,不会清空这块内在,所以对id的修改都会影响这块内存
id++是先取id,后执行++操作,所以输出结果会从0开始