有两个类
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.....的啊?这是为什么?
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.....的啊?这是为什么?
楼主再加一条System.out.println(A.c++);这样输出的值就会增加
你说:“java虚拟机动态加载应用需要的类,有些类在classpath范围中,但是实际运行中并没有加载,当然该类的属性不会出现在进程内了”照你这么说,一个类的static属性也只是在加载其所在的类之后才被存储到内存中的,是吗?可是你又说了,在一个进程内,static属性会存在的,static属性一旦改变了值,则整个进程内再次获取的static属性的值就是其改变后的值,这与你刚才说的不是有点矛盾吗?
麻烦你再解释一下,
它被保存在类的内存的公共存储单元中,而不是保存在某个对象的内存区中。
一个类的任何对象都可以访问它,因此,它的值会增加!!!
这样说吧:
static变量,是属于类的,也就是说类的任何对象都可以访问它并修改它,但修改后的结果还是共享的
因为每次都是初始化 所以一样了 再加个System.out.println(A.c++); 就OK 了
可以说明白原因了吧
你每次运行你的程序都是在一个JVM中运行的,它载入你的类,然后程序退出,JVM停止,再运行,重复上述步骤。
Done。
我再用B 定义了main(String[] arg){
System.out.println(A.i++);
}
javac A.java
javac B.java
java B
1为啥没有楼主说的那个2 《当然如果我添一行就有2了》 这样就证明static i 在JVM执行完-次后是不会保存数据?
但是如果按照你这么说的话,又会一个新的问题,
你说:“类有一个生命周期,就是从JVM载入类,到JVM停止运行。”,
如果我的应用程序在运行时,我设置的CLASSPATH如果指向的类路径包含的类很多很多,按你的说法,只要我的这些类被JVM载入了,那么类就会在内存中“生存”,对吗? 如果这样的话,时间长了,那内存还消耗得起?这个问题,麻烦你解释一下,
那你解释一下,Tomcat WEB应用里面的类的静态数据为什么可以长久保存?那你说Tomcat WEB应用只是一个进程吗?
那你解释一下,Tomcat WEB应用里面的类的静态数据为什么可以长久保存?那你说Tomcat WEB应用只是一个进程吗?
***********************************
你说的长久保存存储在IE或者服务器的项目路径下了。。
你的结果怎么可能是2呢?结果是1。
用static修饰的数据成员是不属于任何一个类的具体对象,而是属于类的静态数据成员。
它被保存在类的内存的公共存储单元中,而不是保存在某个对象的内存区中。
一个类的任何对象都可以访问它,因此,它的值会增加!!!
改动程序为:
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初始化,不打了累死了,自己找原因了。