static成员变量在两个不同程序分别运行时,数据能否共享的问题。

昨天晚上在写一个局域网的聊天程序,我在服务器端定义了个Map类型的类属性,保存着用户昵称和服务器输出流之间的映射关系。然后我在客户端调用服务器端那边的类属性。程序运行的时候就乱了。最后我找了好久,在不同的地方用输出语句测试了好久(关键是用eclipse的DUBUG的时候,好像没用)。最后终于锁定是客户端调用服务器端那边的类属性有问题。我取不到值,输出都是null。这是为什么呢?最后我另外写了两个测试程序测试了下静态属性到底在两个不同的程序上分别运行时,数据能不能共享。

先定义个work类,里面有静态属性b

public class work {

	public static  int b =2;
	public static void main(String[] args) {
		
		System.out.println(b);
		b=5;
		
	}
}

然后定义个Test类,在Test类的主方法里,先输出b的值,再对b进行修改。

public class Test {
	public static void main(String[] args) {
		System.out.println(work.b);
		work.b=7;
	}
}
现在我先运行Test程序,输出结果为2,这个在我的预料之中。关键是运行第二个程序work时,程序的输出类的成员变量b的值,这个属性值是多少?结果依然是2,而不是我们修改后的7.

这是怎么回事呢?怎么不是7啊?不是说好的,同一个类的所有实例的静态属性共享同一块内存区吗?第一次运行Test程序时改变了静态属性b的值,所以第二次运行程序work时,b属性也要受到影响啊!这个问题困扰了我一个晚上。测试完一看时间,12点半了。好晚了,洗洗睡吧,明天多查查资料看看。于是带着这个问题,我睡觉去了。

早上的时候,果断打开了疯狂javaPDF版。开始搜索答案。终于,皇天不负有心人,我找到了。原来是因为运行Test和work是两次JVM进程,第一次JVM运行结束后,它对work类所做的修改将全部丢失---第二次运行JVM时将再次初始化A类。就是说,两个程序处于两个不同的JVM进程中,两个JVM之间并不会共享数据

就像程序员解决了BUG很兴奋一样,我找到了问题所在,也很兴奋。就写篇文章记录下,以防自己或者别人再遇到类似问题时,百度不到吧。说实话,这问题我还真不知道该怎么百度,怎么描述。其实遇到这问题,我是很开心的,因为我又发现了我所不懂的知识,我认为这就是程序员的成长之路,在问题中寻找答案,在寻找答案之中长知识。至于怎么解决我的局域网聊天问题,还得思考下。哎,编程之路,任重而道远。

### 回答1: 是的,Java中自定义类中的static int变量会随着程序的运行而不断累积,每次运行不会清零。这是因为static变量是属于类而不是对象的,也就是说它只会被初始化一次。因此,每次运行程序时,这个变量的值会在上一次运行的基础上累加。如果需要在每次运行程序时清零这个变量,可以在程序启动时手动将其初始化为0。例如: ```java public class MyClass { static int count = 0; public static void main(String[] args) { // 在程序启动时手动将count初始化为0 count = 0; // 其他代码 } } ``` ### 回答2: 在Java中,自定义类中的静态(static)int变量是属于类的,而不是属于对象的。这意味着,静态变量在程序运行期间只有一份拷贝,无论创建多少个对象,它们都只是共享这一份静态变量的值。 因此,静态int变量不会随着程序的运行而累积,也不会清零。它的值只会在各个对象之间进行共享和修改。 例如,假设我们在一个自定义类中定义了一个静态int变量num,并初始化为0,然后创建了两个对象obj1和obj2。如果我们通过其中一个对象修改了num的值,那么另一个对象所看到的num的值也会发生变化。 这是因为静态变量是在类加载时初始化的,它的值在整个程序运行期间是保持不变的,除非我们通过类名直接修改它。所以,无论我们多少次运行程序,静态int变量的值都不会被清零,只会被共享和修改。 如果想在每次运行程序时重新初始化静态变量的值,我们可以在程序的某个合适的位置手动将其赋值为初始值,例如在主方法中或构造方法中。这样,每次程序运行时静态int变量的值都会重新初始化为初始值。 ### 回答3: 在Java中,自定义类中的static int变量不会随着程序的运行而不断累积,并且每次运行都会重新初始化。下面我来详细解释一下: 首先,static关键字表示该变量属于类本身,而不是类的实例。由于它属于类级别的成员,所以无论创建多少个该类的对象,static变量只有一份副本。 其次,由于static变量属于类而不是对象,它在程序的生命周期中只会被初始化一次。当程序启动时,系统会为所有的类进行初始化,其中包括对static变量的初始化。此时,static int变量会被赋予初始值,通常为0。 然后,在程序运行过程中,无论创建多少该类的对象,它们都会共享同一份static变量。当某个对象修改了static变量的值,其他对象也能够看到这个变化。因此,static变量的修改是全局可见的。 最后,在每次程序运行结束后,static变量的值并不会保留,而是会被重新初始化。也就是说,下一次程序运行时static int变量会重新赋值为初始值0。 综上所述,Java中自定义类中的static int变量不会随着程序的运行而不断累积,而是每次运行都会重新初始化。如果需要实现变量的累加功能,可以在类中使用实例变量来实现。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值