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!
分享到:
相关推荐
在阅读过程中,尝试编写简单的Java程序,使用static关键字定义和调用静态成员变量和静态方法。 建议通过阅读相关的Java教材或搜索资料,进一步扩展学习与static关键字相关的高级主题,如静态代码块、静态内部类和...
《Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java 开发环境 JDK JRE Java 开发环境配置 Java 基本语法 数据类型基础语法运算符 Java 执行控制流程条件语句 ...静态变量的特点类变量 局部变量
这个程序是一个用Java语言编写的龟兔赛跑的程序,它可以模拟一个简单的竞赛...它还使用了一个随机数生成器,用于随机生成乌龟和兔子的速度,并使用了一个静态变量和一个静态方法,用于记录比赛是否结束和比赛的胜利者。
面试问题整理:JVMJRE、JDK、JVM,JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机。...这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。
第5 版 清华大学出版社 “SCJP学习指南” 人民邮电出版社 “Java 编程思想” 第3版 机械工业出版社 教学内容和要求 知识点 重要程度 使用频度 难度 Java 入门 高 中 易 变量和运算符 高 ...
访问静态变量和方法的方式 5.静态代码块和其他代码块的执行顺序 6.静态内部类 7.静态导包 1.static的作用 (1)static是一个能创建独立于具体对象的域变量或者方法 即使没有创建对象也能使用的属性和方法(这一点很...
4.4.4 尽量少用静态变量 4.4.5 避免在经常调用的方法、循环中创建Java对象 4.4.6 缓存经常使用的对象 4.4.7 尽量不要使用finalize方法 4.4.8 考虑使用SoftReference 4.5 小结 第5课 表达式中的陷阱 5.1 关于...
这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。 ACT_ID_*: 'ID'表示...
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
static是为了在静态方法中可以返回当前类中的对象 final:可加可不加,加了可以保证不可修改,且提供获取效率 3. 提供一个public修饰的方法getInstance给外部返回一个对象 4. 单例模式...
抽象类的应用场景:【理解】二、static (静态的)1. static可以修饰属性2. static 可以修饰成员方法3. static 可以修饰初始化代码块扩充内容三、final(最终的,最后的)1.final可以修饰变量2.final可以修饰方法3....
由于并发程序固有的不确定性,传统的调试技术是不够的,尤其是在事后调试的场景中。 通过静态分析来探查缺陷可以避免高昂的故障重现成本。 在本文中,我们提出了一种针对并发错误的新颖调试方法。 我们利用错误报告...
生活中的接口 接口的定义基本格式 接口就是多个类的公共规范. 接口是一种引用数据类型,最重要的内容就是其中的:抽象方法 接口的使用场景是什么? 我们创建一个接口.然后通过实现此接口来规范多个类 如何定义一个接口...
1.2. 使用场景 2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@...
适用于各种应用场景,从对响应速度有很高要求的大网站到功能繁多的CMS管理系统都适合。Beetl本身还具有很多独特功能来完成模板编写和维护,这是其他模板引擎所不具有的。2、非常简单:类似Javascript语法和习俗,...
主要技术包括:⼤数据前篇(什么是⼤数据,应⽤场景,如何学习⼤数据库,虚拟机概念和安装等)、Linux常见命令(⽂件管理、系 统管理、磁盘管理)、Linux Shell编程(SHELL变量、循环控制、应⽤)、Hadoop⼊门...
11.3 静态和非静态的方法.129 11.4 方法的重载.130 11.5 操作符重载.134 11.6 小 结.137 第十二章 域 和 属 性 .139 12.1 域 .139 12.2 属 性 .143 12.3 小 结 .146 第十三章 事件和索引指示器 .148 ...
Map-Cutter-JavaFX 该程序应通过创建表示每个区域的SVGPath... 此类将创建具有特定值的变量以控制区域的位置平移(X&Y),因此它们将完全可调整大小,并且应符合场景的大小更改。 保留所有权利-Yahya Almardeny。