打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
java 局部变量和全局变量问题
所谓临时变量,就是为了方便起见申明的变量,存放一些中间结果。有点像中学几何里 
面的辅助线。 
如果基于性能的考虑,避免每次调用的时候为临时变量分配空间,就可以将它声明为成 
员变量,例如临时压缩缓冲区。 
如果基于性能的考虑,避免每次访问的时候访问成员变量(尤其在循环的时候),就可 
以将它声明为临时变量。 
如果要在避免在函数之间传递大量参数,也可以用成员变量来节约参数个数和占用的空 
变量可以在任何类中申明,但是逻辑关系要清楚。
我认为同意那个高手的意见.全局变量是不应该使用的. 
在java中也不存在全局变量的概念. 
如果是全局的就用单例. 
全局变量会导致使用的扩散,无法控制对该变量的调用. 
而且对于现在的趋势,硬件的成本远远低于软件的成本.
原来楼主要讨论的是变量是应该在方法外声明还是在方法内声明
这一点我想的不多,只认为最简单的原则是:
用来耦合的在方法外声明,否则一律在方法内部声明,不必要的存在只会造成不必要的错误

面向对象程序设计中,我不习惯再叫什么‘全局变量’。而叫类成员。在同一个类当中,只要能够使用(
不考虑静态成员和非静态成员的访问控制),那就是全局的,类方法中的参数,是局部的。
在类中,如果对类成员‘读’的地方比较多,我觉得设计往往是合理的,如果‘写’的地方比较多,我建
议尽量做成参数传递,然后提供一个公共方法读取。
静态成员对于类实例来说,就有点‘全局变量’的味道了。
Java程序中   ,不能在所有类之外定义全局变量   ,只能通过在一个类中定   
义公用、静态的变量来实现一个全局变量。例如   :  
Class   GlobalVar{   
public   static   global_var;   
}  
在类   GlobalVar中定义变量   global_var为   public   stat-ic,使得其它类   
可以访问和修改该变量。  
========================================= 
这是全局变量的定义,如果有可能的话,尽量使用局部变量为好

“private   HashMap   hm;//呵呵,我称此种为全局变量”
其实,“全局”与“局部”也是相对而言的,相对于类的内部,可以认为是“全局”的。相对于其它的类
,也可以认为是“局部”的。如果某一private变量拥有getter或/和setter,我们还可以称之为“属性”
我觉得,在编程实践中,用哪一种方式,完全是根据实际需要而定。不应象楼主说的那位“高手”那样做
强制的要求。
还有一点,面向对象的思想强调的是“对象和对象的有机联系”,那么,一个类中如果就只有方法,那么
跟以前面向过程编程一样了吗?这样做是不是违背了面向对象的初衷呢? 
> > 
错了,其实不完全是这样的。因为很有可能这个类本身的存在,就是面向对象的一个部分。比如,俺给你
举一个简单的例子来说明吧: 
一个配置加载的类比如说ConfigLoader从配置文件中加载配置信息,配置可能是这样的nv对: 
name   :   value. 
作为客户来说,并不需要关心这个value是什么,可能只是需要根据这个value创建出来的一些结果,比如
配置类名通过反射机制来创建就可以了。 
那么通常ConfigLoader这么做:假设使用HashMap来存储: 
final   Map   map   =   new   HashMap(); 
//   ...   读取配置文件的内存 
for(each:...)   { 
        String   name   =   each.getName(); 
        String   value   =   each.getValue(); 
        Object   actualValue   =   build(value); 
        map.put(name,   actualValue); 

Object   build(String   value)   {...} 
//   .. 
这样是一种通常的做法,但是如果细了说,ConfigLoader这个类实际上有两个职责了: 
(1)   加载配置文件。 
(2)   根据指定的value来构建对象实例。 
可能会导致的问题是,第一构建方法的变化会导致ConfigLoader这个不相关的类的修改,第二,对单元测
试增大了难度,至少看起来不是一个优美可测的结构。
因此,在这样的情况下,就可以把构建的内容单独抽离到一个新的对象中去做: 
class   Builder   { 
        Object   build(String   value)   {...} 

刚才的程序片断就简单变为: 
map.put(each.getName(),   new   Builder().build(each.getValue()); 
这样,即便构建的逻辑发生变化,对于ConfigLoader来说是没有任何影响的。
楼主可以看看比如Builder这个类,它本身没有任何变量,就是提供了一个build的方法。。但是它本身就
是体现了面向对象的一个部分,它承担了构建这个责任。
================= 
另外,也有变成面向过程的编程,通常就是俺们经常使用的工具类,就是做的面向过程的事情。 
final   public   class   Utils   { 
        private   Utils()   {} 
        public   static   void   someMethod(...)   {...} 

这个someMethod就是一个典型的面向过程的东西。 
当然要记住,这样的写法并不是完全不可取的。。在需要的场合,很大程度上这样是一个不错的解决方式

再说了,我经常看到有类似下面的声明:
public   class   Test{ 
    private   String   s; 
    protected   HashMap   hm; 
    private   List   list; 
    public   ...   ... 
    public   Test(){ 
        s   =   "test "; 
        hm   =   new   HashMap(); 
        list   =   new   ArrayList(); 
        ...   ... 
    } 
}
可以这么说,凡是在构造方法中创建的变量都是这种意义上的局部变量,那就是说,如果其为非private的
话,那么是提供给别的类访问用的,是可以声明为这种意义上的全局变量的,那么如果是private的话,那
么本就不应该这么去创建和声明???而应该尽可能得把它放在局部去声明和创建,应用的时候,靠方法
的参数和返回值来通信????

jvm对于内存资源的回收需要等待一个collection周期,而不是实时回收。 
如果对一个变量的使用率频繁建议使用全局。可以节省CUP分配内存空间的时间。 
如果使用局部变量。虽然在整个程序运行期内存资源消耗减少。可是CUP要花更多时间用在内存资源分配上

过去,使用面向过程的编程方法时,时常讨论“局部变量”和“全局变量”的问题。
早期(20世纪80年代或更早)没有结构化程序设计思想或方法时,变量都是“全局”的,即整个程序可以访
问到每一个变量。
后来(20世纪80年代至90年代),有了结构化程序设计思想,程序员们就觉得,哎呀,用局部变量怎么能行
呢?全局变量多好呀,程序想怎么写就怎么写,有了一个变量,想在哪用就在哪用,想怎么用就怎么用。
可是,没过多久,思想转变了,程序员们又觉得,还是少用全局变量好呀!你看,我们写的程序,结构多
么清晰呀,读来就象一股清泉,简直就是一部艺术作品呢!
现在,我们采用的是面向对象的思想和方法!全局变量在哪里呢?根本就没有嘛。我们只有被称作“类成
员”的东西!
“类成员”可以称为“全局变量”吗?姑且称之。且慢!如果是private的,还能称之为“全局变量”吗?
好,好,就算它们全部是public的,是否所有的数据全都要由“类成员”保管吗?如果是的话,我们应该
考虑一下,就与“面向对象”的思想可能就是背道而驰的了。

谢谢上面的朋友们:
我说的全局变量就是指同时有几个方法都要用到的变量,这些变量可以说会经常被使用,方法可以基于它
们进行通信,我觉得如果要是写成局部变量的话,那么很多方法都会有入参和返回值,这样不便于阅读和
理解代码啊
在上面,大家异口同声得回答局部变量,原因基本上是:
1.资源消耗少 
2.最少通信原则
我也同意这点,但是这和“类内部强耦合”相冲突,希望多讨论讨论这方面~~~~~~
再一个,对于“2.我们写的类到时候要被多线程调用的,所以局部变量更好一点”这一点,我的想法是: 
“变量是全局的还是局部的,和多线程调用并无关系,到时只要在总方法上加上synchronized就 
好,而且,即使变量是局部的,要是多线程调用时,也得加上同步不是?”
也请在这一点上多发言~~~~~~~~

再次谢谢大家的发言~

局部变量是避免多线程造成变量非同步操作错误的有效措施
越小域的变量越安全,当一个变量超出它所应用的范围后,他剩余的时光只是浪费资源和造成错误
局部变量是避免多线程造成变量非同步操作错误的有效措施
越小域的变量越安全,当一个变量超出它所应用的范围后,他剩余的时光只是浪费资源和造成错误

要看那种情况,假如你的这个变量是作为循环体内使用,那么用“全局”吧,如: 
Student   student=null; 
for(Iterator   iter=datas.iterator();iter.hasNext();){ 
          student=(Student)iter.next(); 

这样可以节约时间,不用没一次循环都要在栈中申请空间以存储引用; 
假如是在类一级的,比如作为类的属性还是方法的变量,原则是假如方法的参数不是很多的话,那么采用方法传递,楼主也说了,可以采用多线程或是池。

使用java也有两年了,以前是用局部变量多一点,后来自己体会到,还是全局变量更能体现面向对象的思想:类的内部应该体现强耦合性,类和类之间应该体现弱耦合性;再说了,每个类要是只是方法堆砌出来的,也没有意思了。
        但是近来,和一个高手做项目,他却要求除过把几个不太变化的对象声明为全局变量外,其它的变量都是用局部变量,我们这个项目比较庞大一点,他的理由是: 
1.全局变量始终占用内存,多了一笔开销 
2.我们写的类到时候要被多线程调用的,所以局部变量更好一点
        我觉得,使用全局变量和使用局部变量相比,内存好像是多占用了一点,但是不会造成内存不足, 
而且,变量是全局的还是局部的,和多线程调用并无关系,到时只要在总方法上加上synchronized就 
好,而且,即使变量是局部的,要是多线程调用时,也得加上同步不是?

很久之前就开始遵循一个原则:变量的最小作用域原则。 
即是尽量不要扩大一个变量的可见范围。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
彻底搞懂java匿名内部类final
Java那些知识点容易混淆
【最新视频】第四十二集 全局变量和局部变量
软件测试面试题
Python编程中面向对象部分最重要的知识就是类
delphi 三种变量:全局变量,类变量,局部变量
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服