`
pengcqu
  • 浏览: 771100 次
  • 性别: Icon_minigender_1
  • 来自: 未来
社区版块
存档分类
最新评论

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!

7
0
分享到:
评论
3 楼 yangpanwww 2013-12-27  
         我是来看 MM 的....头像好诱惑的啊.....
2 楼 yang668 2011-10-14  
   
1 楼 MyDicta 2010-01-23  
类的静态变量,在多线程应用开发中,请问会不会存在安全问题?

相关推荐

    Java零基础-static关键字.md

    在阅读过程中,尝试编写简单的Java程序,使用static关键字定义和调用静态成员变量和静态方法。 建议通过阅读相关的Java教材或搜索资料,进一步扩展学习与static关键字相关的高级主题,如静态代码块、静态内部类和...

    Java 基础核心总结 +经典算法大全.rar

    《Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java 开发环境 JDK JRE Java 开发环境配置 Java 基本语法 数据类型基础语法运算符 Java 执行控制流程条件语句 ...静态变量的特点类变量 局部变量

    一个用Java语言编写的龟兔赛跑的程序

    这个程序是一个用Java语言编写的龟兔赛跑的程序,它可以模拟一个简单的竞赛...它还使用了一个随机数生成器,用于随机生成乌龟和兔子的速度,并使用了一个静态变量和一个静态方法,用于记录比赛是否结束和比赛的胜利者。

    Java常见面试问题整理.docx

    面试问题整理:JVMJRE、JDK、JVM,JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机。...这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。

    AIC的Java课程1-6章

    第5 版 清华大学出版社  “SCJP学习指南” 人民邮电出版社  “Java 编程思想” 第3版 机械工业出版社  教学内容和要求 知识点 重要程度 使用频度 难度 Java 入门 高 中 易 变量和运算符 高 ...

    小朋友你是否对java中的static满脸问号

    访问静态变量和方法的方式 5.静态代码块和其他代码块的执行顺序 6.静态内部类 7.静态导包 1.static的作用 (1)static是一个能创建独立于具体对象的域变量或者方法 即使没有创建对象也能使用的属性和方法(这一点很...

    突破程序员基本功的16课.part2

    4.4.4 尽量少用静态变量 4.4.5 避免在经常调用的方法、循环中创建Java对象 4.4.6 缓存经常使用的对象 4.4.7 尽量不要使用finalize方法 4.4.8 考虑使用SoftReference 4.5 小结 第5课 表达式中的陷阱 5.1 关于...

    activiti工作流代码案例

    这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。 ACT_ID_*: 'ID'表示...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    day020-继承加强和设计模式代码和笔记.rar

    static是为了在静态方法中可以返回当前类中的对象 final:可加可不加,加了可以保证不可修改,且提供获取效率 3. 提供一个public修饰的方法getInstance给外部返回一个对象 4. 单例模式...

    资深互联网大佬的5000字吐血总结——Java面向对象三大修饰符之abstract、static、final

    抽象类的应用场景:【理解】二、static (静态的)1. static可以修饰属性2. static 可以修饰成员方法3. static 可以修饰初始化代码块扩充内容三、final(最终的,最后的)1.final可以修饰变量2.final可以修饰方法3....

    通过可视化和事件结构推断来调试并发程序

    由于并发程序固有的不确定性,传统的调试技术是不够的,尤其是在事后调试的场景中。 通过静态分析来探查缺陷可以避免高昂的故障重现成本。 在本文中,我们提出了一种针对并发错误的新颖调试方法。 我们利用错误报告...

    java-接口的使用,多态的使用,instanceof关键字,笔记本usb接口案例

    生活中的接口 接口的定义基本格式 接口就是多个类的公共规范. 接口是一种引用数据类型,最重要的内容就是其中的:抽象方法 接口的使用场景是什么? 我们创建一个接口.然后通过实现此接口来规范多个类 如何定义一个接口...

    Spring-Reference_zh_CN(Spring中文参考手册)

    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. 对@...

    Beetl模板引擎-其他

    适用于各种应用场景,从对响应速度有很高要求的大网站到功能繁多的CMS管理系统都适合。Beetl本身还具有很多独特功能来完成模板编写和维护,这是其他模板引擎所不具有的。2、非常简单:类似Javascript语法和习俗,...

    大数据培训课程安排.pdf

    主要技术包括:⼤数据前篇(什么是⼤数据,应⽤场景,如何学习⼤数据库,虚拟机概念和安装等)、Linux常见命令(⽂件管理、系 统管理、磁盘管理)、Linux Shell编程(SHELL变量、循环控制、应⽤)、Hadoop⼊门...

    C#微软培训资料

    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(可缩放矢量图形)来帮助将给定的图像(地图)切成可视区域。

    Map-Cutter-JavaFX 该程序应通过创建表示每个区域的SVGPath... 此类将创建具有特定值的变量以控制区域的位置平移(X&Y),因此它们将完全可调整大小,并且应符合场景的大小更改。 保留所有权利-Yahya Almardeny。

Global site tag (gtag.js) - Google Analytics