static成员变量在使用完全同样的代码运行起来的两个不同程序分别运行时,数据能否共享的问题

在学习韩顺平老师的Java课程时,遇到一个问题。写多用户在线通信项目时,客户端使用了一个静态的HashMap来保存在本客户端启动的多个线程。我的疑问是,当在同一台电脑登录多个用户时,每登录一个用户就需要使用一个客户端,每打开一个客户端,就需要run一遍客户端的代码,每在客户端成功登录,就会有一个打上userId标签的线程加入本客户端的HashMap,那么这个静态的HashMap的内容是电脑中多个客户端所共享的吗?如果不是共享的,那么这个HashMap就没有设置的必要了。通过这个程序验证,HashMap的内容是不会给多个客户端共享的。

在IDEA打开此设置:

这样就可以运行代码并行了。右键运行多次下面的代码进行测试:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;

/**
 * @author Albert
 * @version 1.0
 * @date 2023/11/29-15:07
 * @describe static成员变量在使用完全同样的代码运行起来的两个不同程序分别运行时,数据能否共享的问题。
 *           在学习韩顺平老师的Java课程时,遇到一个问题。写多用户在线通信项目时,
 *           客户端使用了一个静态的HashMap来保存在本机启动的多个线程。我的疑问是,当在同一台电脑登录多个用户时,
 *           每打开一个客户端,就需要run一遍客户端的代码,在客户端成功登录,就会有一个线程加入HashMap,
 *           这个HashMap的内容是电脑中多个客户端所共享的吗?如果不是共享的,那么这个HashMap就没有设置的必要了。
 *           通过这个程序验证,HashMap的内容是不会给多个客户端共享的。
 */
public class People {
    public static HashMap<String, String> hm = new HashMap<>();

    public static void main(String[] args) {
        while(true){
            Scanner scanner = new Scanner(System.in);
            System.out.print("name(把name设置为\"exit\"退出系统):");
            String name = scanner.next();
            System.out.print("age:");
            String age = scanner.next();
            hm.put(name, age);

            if(name.equals("exit")){
                System.out.println("退出系统");
                break;
            }
            System.out.println("输出所有人的信息:");
            Iterator iterator = hm.entrySet().iterator();
            while (iterator.hasNext()) {
                Object next = iterator.next();
                System.out.println(next);
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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变量不会随着程序的运行而不断累积,而是每次运行都会重新初始化。如果需要实现变量的累加功能,可以在使用实例变量来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值