Java中静态变量的适用场景

Java类中的静态变量在程序运行期间,其内存空间对所有该类的对象实例而言是共享的,有些时候可以认为是全局变量。因此在某些时候为了节省系统内存开销、共享资源,可以将类中的一些变量声明为静态变量,通过下面的例子,你可以发现合理应用静态变量带来的好处:

 

public class WeekA{

       static class Data { 

             private int week;
             private String name;
             Data(int i, String s) {
                   week= i;
                   name = s;
             }
       }

       Data weeks[] = {
             new Data(1, "Monday"),
             new Data(2, "Tuesay"),
             new Data(3, "Wednesday"),
             new Data(4, "Thursday"),
             new Data(5, "Friday"),
             new Data(6, "Saturday"),
             new Data(7, "Sunday")
       };

       public static void main(String args[]) {

             final int N = 10000;
             WeekA weekinstance;
             for (int i = 1; i <= N; i++){
                   weekinstance = new WeekA ();
             }

       }

}

 

在上面这段代码中,没有将Data weeks声明为静态变量,因此当创建WeekA对象时将会得到10 000个weeks对象的副本,这些对象被保存在内存中,但是weeks对象中的数据却从来没有被更改过,而且十分稳定。因此,如果能使所有对象共享该数据对象是个不错的解决办法,请看下面的代码:

public class WeekB{

      static class Data { 

             private int week;
             private String name;
             Data(int i, String s) {
                   week= i;
                   name = s;
            }

      }

      static Data weeks[] = {
             new Data(1, "Monday"),
             new Data(2, "Tuesay"),
             new Data(3, "Wednesday"),
             new Data(4, "Thursday"),
             new Data(5, "Friday"),
             new Data(6, "Saturday"),
             new Data(7, "Sunday")
      };

      public static void main(String args[]) {

             final int N = 10000;
             WeekB weekinstance;
             for (int i = 1; i <= N; i++){
                   weekinstance = new WeekB ();
             }
     }

}    

 请注意在类WeekB中,在Data weeks[]之前添加了static关键字,将该对象变量声明为静态的,因此当你创建10 000个WeekB对象时系统中只保存着该对象的一份拷贝,而且该类的所有对象实例共享这份拷贝,这无疑节约了大量的不必要的内存开销,同时实现了要完成的系统功能。

那么是不是我们应该尽量地多使用静态变量呢?其实不是这样的,因为静态变量生命周期较长,而且不易被系统回收,因此如果不能合理地使用静态变量,就会适得其反,造成大量的内存浪费,所谓过犹不及。因此,建议在具备下列全部条件的情况下,尽量使用静态变量:

(1)变量所包含的对象体积较大,占用内存较多。

(2)变量所包含的对象生命周期较长。

(3)变量所包含的对象数据稳定。

(4)该类的对象实例有对该变量所包含的对象的共享需求。

如果变量不具备上述特点建议你不要轻易地使用静态变量,以免弄巧成拙。

 

本文内容有部分引用自《Java优化编程》

文中理解有误之处, 还望高手指点!

 

相关链接:

★  Java知识点汇总 

全球软件项目外包平台 兼职做外包 挣Money!

用rsl_rl训练四足机器人走梅花桩:PPO算法调参实战与避坑指南 本文详细介绍了如何使用rsl_rl框架和PPO算法训练四足机器人在梅花桩上行走的实战经验。通过分析梅花桩场景的独特挑战,提供PPO算法关键参数配置策略、奖励函数设计方法以及常见问题的解决方案,帮助开发者高效实现机器人平衡控制。文章特别强调了仿真到实机的过渡技巧,最终实现98%的过桩成功率。 阅读详情

相关推荐

【ENVI初学】查看影像空间分辨率及重采样

例如,如果线段长度为900米,对应的像素数量为30个,那么影像的空间分辨率为30米。通过计算长度与像素数量的比值,即可得到影像的空间分辨率。,在弹出的对话框中,输入重采样后输出文件的xy分辨率大小。在测量结果窗口中,可以看到该线段的长度以及角度。在影像上点击并拖动鼠标,绘制一条直线段。工具,选择要重采样的影像后点击ok。,避免了插值过程中光谱信息的改变。:最近邻插值法通过选择原始影像中。在ENVI中打开影像后右键选择。指示了每个像素的地理跨度(聚合为一个新像素,通常通过。方法一:查看影像的元数据。

weixin_41619112的博客 5571

什么情况下使用静态变量?

在程序设计中,当一个变量会被类的多个实例化对象所共享,以实现多个对象之间的通信,或用于记录已被创建的对象个数时,这种情况下使用静态变量。 因Java中没有全局变量的概念,所以静态变量相当于其他程序设计中的全局变量;将一个变量定义为静态变量的方法就是将这个变量标记上关键字static即可。 ...

zl1520_1140的博客 1643

大数据运维面试题及答案

1. 架构组成:- 2 个 NameNode(Active 活跃节点、Standby 备用节点),实时同步元数据(通过 JournalNode 集群,默认 3 个节点,存储 edits 日志,Active 写入、Standby 读取以保持元数据一致);- 容错性强:通过 RDD 的 “ lineage(血缘)” 机制,任务失败时可快速重算,无需从头执行。:集群 “大脑”,管理元数据(文件目录、块位置),实时响应客户端请求,数据存于内存,元数据镜像(fsimage)和编辑日志(edits)持久化到磁盘;

weixin_42795092的博客 905

Java中静态变量和静态方法的优缺点以及应用场景

Java静态变量和静态方法会在程序初始化运行时候就加载到内存,这个就使它既然好处又有缺点。 优点:不需要在进行实例化。静态变量的值,直接赋新值即可,不需要参数传递,之后可以直接进行参数引用即可;静态方法可以直接通过"类名.方法"的形式进行方法调用。通常方法被多次调用,并且方法中没有动态方法引用的时候使用比较方便。 缺点:初始化加载到内存,如果后续没被引用,加大了内存负担和程序运行负担,影响程序运行...

xxx 4383

别再凭感觉了!手把手教你用Excel搞定激光器MPE与NOHD安全计算(附模板下载)

本文详细介绍了如何利用Excel自动化计算激光器的MPE(最大允许照射量)和NOHD(标称眼危害距离),提升激光安全评估的效率和准确性。通过实战案例和模板下载,帮助工程师快速掌握GB/T 7247标准中的关键计算,避免常见错误,适用于激光测距仪等设备的安评工作。

weixin_30954265的博客 465

用STM32L552驱动AD9102:一个硬件工程师的实战避坑指南(附完整代码)

本文详细介绍了如何使用STM32L552微控制器驱动AD9102任意波形发生器芯片,从硬件设计到波形生成的完整实战指南。内容包括电源架构、时钟电路设计、输出调理电路等关键硬件设计要点,以及软件驱动架构、波形存储优化和典型波形生成实例。通过实战经验分享,帮助硬件工程师避开常见设计陷阱,提升开发效率。

weixin_30889885的博客 333

静态变量使用场景?

在C#中,静态变量是一种特殊类型的变量,称为类变量或静态字段。静态变量是在整个应用程序域内共享的,不属于任何特定的对象实例。以下是静态变量的一些使用场景:1. 共享数据静态变量可以用于存储应用程序中的共享数据,例如全局配置数据或计数器等。当一个静态变量被修改时,所有使用该变量的代码都将受到影响。例如:```csharp public static class AppConfig { pub...

dotNET跨平台 255

(2)NPW(监控片)【中】---业务场景精讲

自己在日常工作当中,由于非产线人员出生,对NPW的知识一直一知半解,业务场景认识的不够透彻,做系统的时候很难理解甲方的NPW业务应用,特收集了不少关于NPW的一些业务场景,下面都是一些摘抄,大家关注我标红标粗的部分,

阿拉伯梳子的专栏 1586

Java 中的静态变量和实例变量有什么区别?它们如何使用?

静态变量和实例变量是 Java 中两种不同类型的变量。静态变量是与类关联的变量,而实例变量是与类的实例(对象)关联的。静态变量使用 `static` 关键字进行声明,被所有该类的对象所共享,可以直接通过类名访问。实例变量不使用 `static` 关键字声明,每个对象都有自己的实例变量副本,必须通过创建类的实例来访问。 静态变量适合在类的所有对象之间共享数据,常用于表示全局配置、常量或共享资源。实例变量适合存储每个对象的独立状态和数据。通过适当的访问权限修饰符,可以控制静态变量和实例变量的可见性。

Java智慧阁 3416

修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

【代码】修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

路~可以走过 2772

视觉Transformer实战 | Transformer详解与实现

本文系统介绍了 Transformer 架构的核心原理与实现。相比传统 RNN 和 CNN,Transformer 凭借自注意力机制有效捕捉序列中的长距离依赖关系,支持并行训练,显著提升效率。其核心创新在于通过查询、键、值向量计算注意力权重,理解单词间的语义关联。架构包含编码器-解码器结构:编码器通过多头自注意力和前馈网络提取输入特征;解码器利用掩码自注意力和交叉注意力生成输出。本文使用 PyTorch 实现了缩放点积注意力、位置编码、层归一化等关键模块,并构建了完整的 Transformer 模型。

盼小辉丶的博客 4万+

Java-Static静态类的使用场景

6、static包导入:使用场景:在工作中遇到多次关键字需要导入类,然后发现他们的命名空间一致,这个时候可以直接 如:import java.util.*:平常工作中,遇到读取配置文件、服务器参数、冷数据的加载、字典数据等等,这个时候可以使用static代码块,避免重新查询数据或创建对象。4、static内部类:一个内部类,加上static,成为static内部类;注意点:类中的静态变量是一个整体,共享给所有对象,一个对象对其值改动,那么所有该静态变量都会跟着变动,牵一发而动全身;定义一个静态方法表示。

人生在手 1518

【中科院一区Top-源码复现】Day-ahead photovoltaic power forecastingwith multi-source temporal-featureconvoluti

【中科院一区Top-源码复现】Day-ahead photovoltaic power forecastingwith multi-source temporal-featureconvoluti

739

java中静态变量的适用场景

Java类中的静态变量在程序运行期间,其内存空间对所有该类的对象实例而言是共享的,有些时候可以认为是全局变量。因此在某些时候为了节省系统内存开销、共享资源,可以将类中的一些变量声明为静态变量,通过下面的例子,你可以发现合理应用静态变量带来的好处: public class WeekA{ static class Data { pr

记录移动开发相关的知识 1067

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java静态变量的适用范围_Java中静态变量的适用场景

Java中静态变量的适用场景Java类中的静态变量在程序运行期间,其内存空间对所有该类的对象实例而言是共享的',有些时候可以认为是全局变量。因此在某些时候为了节省系统内存开销、共享资源,可以将类中的一些变量声明为静态变量,通过下面的例子,你可以发现合理应用静态变量带来的好处:Java代码public class WeekA{static class Data {private int week;p...

weixin_30533109的博客 614

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

多级运放组合电路:从输出表达式反推电阻参数的拆解技巧

运算放大器是模拟电路的核心器件,其分析基础建立在虚短、虚断与深度负反馈原理之上。掌握这些原理后,面对多级运放组合电路,关键不在于记忆公式,而在于将复杂系统拆解为反相放大、求和、差分等独立功能模块,再按信号流向逐级推导传递关系。这种结构化拆解能力既是考研电路题中反求电阻参数的核心方法,也是工程实践中调试实际电路的有效思路。在LM358与TL431组合的可调稳压电路中,同样需要识别基准源与反馈网络,通过改变分压电阻比例实现输出电压调节。从考试到工程,真正训练的是透过表达式看清电路结构的能力,进而控制电路行为、解

weixin_30247781的博客 441

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java静态对象使用场景_Java中静态变量的适用场景

Java中静态变量的适用场景Java类中的`静态变量在程序运行期间,其内存空间对所有该类的对象实例而言是共享的,有些时候可以认为是全局变量。因此在某些时候为了节省系统内存开销、共享资源,可以将类中的一些变量声明为静态变量,通过下面的例子,你可以发现合理应用静态变量带来的好处:Java代码public class WeekA{static class Data {private int week;p...

weixin_42503008的博客 366

Java中基于静态变量与单例模式对缓存的简单实现

目录   ●What &amp; Why ●静态变量实现缓存 ●单例模式实现缓存 ●小结 ●What &amp; Why 缓存是什么?他有什么好处?相信不用说大家都知道。 目前笔者在做一个Java开发的Web项目,项目启动的时候需要将大量不变的平台数据放入缓存中,方便快速读取。一开始笔者很疑惑,Java是不能直接操作内存的,但是我们缓存却是要把数据放入内存中,那这是怎么实现的呢?抛...

jui121314的博客 2440
上一篇: 好书推荐《Java优化编程》
下一篇: Java中泛型的本质
PengJune
博客等级 码龄21年 9粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值