java中的全局变量

知识点,转自网上

 

    首先,java中是没有全局变量这个概念的,java程序中不能像C++那样在类外定义全局变量,因为JAVA当初出现的初衷就是为了安全性和跨平台性, 所以去掉了类似C、C++中的全局变量的概念。JAVA中不应该有所谓全局变量的概念,全局变量严重影响了封装和模块化,所以中需要所谓的全局变量,那一 定是对程序的设计出了问题。以上是网上的观点,但就我目前来说,一个能在全局上使用的变量是有必要的。
    第二点,java提供了public static关键字来实现一个全局的变量。如果程序只有一个包的话,那么将这个public static(被声明为static的变量不需要实例化对象即可直接使用类名来引用之) 修饰的变量放到程序初始化的地方去实现,就可以在这个程序的各个地方直接调用这个变量了。这虽然不叫全局变量,但实际使用中和全局变量的意思是一样的。当 然你也可以完全不用全局变量,可以写一个类,定义一般变量,并为该类定义一些操作变量的方法,通过调用可以更改变量的这些方法来达到使用全局变量的目的。
    还有,关于static的用法,static可以修饰变量、方法,也可以修饰类,但是static类只能是内类。
    静态内部类在概念和实现上都十分简单,基本上来说就是在您的主类中定义一个静态类:
public class Foo
    {
    // ....

    public static class Test
      {
      public static void main (String[] args)
          {
          // ....
          }
      }
    }

    说到向您主要的类中添加辅助代码,其中最重要的一点就是静态内部类被编译到一个单独的 .class 文件中,这个文件独立于它的外部类。例如,如果外部类叫做 Foo,而它的一个内部类叫 Test,那么这个内部类将被编译成 Foo$Test.class 文件。.class 文件的分离意味着您可以将辅助的嵌套代码与主要的外部类牢固地捆绑在一起。它们在同一个源文件中,内部类的确是在外部类的内部。您无需再付出任何发布或运 行时的开销。真棒!例如,如果辅助代码只是用于调试,那么您只需发布 Foo.class 文件而将 Foo$Test.class 文件留下即可。
    我将这个技巧主要用于编写外部类的演示代码、错误调试代码,以及进行单元测试实现类行为的自动验证。(当然,做为一个勤奋的开发人员,我准备将测试代码转化成单元测试。)
注意,要执行 Foo.Test 类的 main() 方法,请使用下面的命令:
           % java Foo$Test
如果您正在使用的命令解释程序(shell)把“$”做为一个保留字,那么您应该使用下面的命令:
           % java Foo//$Test
还 有一点十分有趣:静态内部类根据定义可以访问外部类的保护域和私有域。这件事可以说既有利也有弊。因为您可能在不经意间就破坏了外部类的保护域和私有域, 从而违反了它的封装性,所以请小心对待!这一功能最恰当的应用就是编写类的白盒测试程序--因为这样可以引入一些利用通常的黑盒测试很难引入的问题(黑盒 测试不能访问对象的内部状态)。
    XYPair 类十分简单。它提供一个固定的整数对,(x,y)。XYPair.Test 类有一个 main() 方法可以对 XYPair 进行简单的测试并输出结果。试着调整测试代码和核心代码来试验各种可能的问题。
如果您更加大胆,您可能想检验 Java 单元测试构架(JUnit)。您可以去掉源代码中的各种注释,然后利用 JUnit 的测试引擎运行这些测试程序。 

注:
    用Static定义的静态成员函数或者静态变量,可以通过其所属类名来直接调用.为什么可以这样?因为既然这个类的所有对象都是使用的这一个变量,那么理 所当然我不需要去从其中的任何一个对象去引用它,而只是通过类名引用就可以了嘛.这样不是可以方便的实现一些全局函数和全局变量吗?把所有全局的函数或者 全局的变量都定义在一个静态类中,调用的时候直接通过这一个类名就可以方便的访问所有的全局变量和全局函数了。

附:
    确实全局变量在某些环境下可能还有其实际的意义。但是在JAVA中,确实没有所谓的全局变量的概念,通过设置一个abstract class or interface,并将许多final or final static field置于其中,并在使用时调用ClassName.xxx or InterfaceName.xxx来模拟全局变量的使用(可以肯定的是,在许多的著作中大师们都已经反复强调了将许多常数放入一个abstract class or interface,并使之成为常数类或常数接口的做法是对此功能的误用,并不鼓励如此使用,有兴趣可以参阅《effective   java》——机械工业出版社出版   Joshua   Bloch   著),但 
    首先,final   or   final   static确实不是全局变量的概念,在JAVA中,一切都是对象,在对象中声明的无论是field还是method亦或是property都将归属于某 一种抽象或具体类型,否则也不会在调用中使用ClassName.xxx or  InterfaceName.xxx这样的形式来加以说明这是这个CLASS的XXX,那是那INTERFACE的XXX。事实上final代表的是一种 常量形式(Constant),而static则代表一种静态观念,常量的概念是为了区别于变量而存在的不变的变量(有些别扭,突然发现自己词语贫乏, HOHO),而静态则是希望区别于某一具体Object而独立存在于某一特定类型的变量(到可以称之为该类型的全局变量,但个人感觉不很确切)。全局变量 的概念显然过于宽泛,以至于我们说一个程序甚至是一个系统拥有一个唯一的变量变成可能,但final   or   static显然不是为其而设计的(当然可以模拟)。 
    其次,阁下提到的有关于“全虚拟机只有一份,数据库连接池对象...”是设计模
式 中所谓单例模式的实际应用,该模式确实非常像所谓的全局变量的概念,但设计这样单个实例确实是因为在系统的整个生命周期中只需要一份该实例存在的缘故,更 多的是突出概念而非实际应用,而全局变量则更多就是为了实际应用而生,这样就会导致许多不成熟的,不加思考的应用加于其上而导致黏糊的像意大利面条一样的 代码。 
    所以个人认为,依在下实在低微的学识实在不敢胡乱评说关于全局变量是否有实
际意义这样巨大的课题,这样的课题还是留给 那些专家去讨论吧。至于如何实际应用全局变量,我看,还是有则去之,无则加冕吧,实在要用偶也么的办法(不过自从使用C++/JAVA开始,全局变量的使 用确实降到了一个极低的程度,也许是因为在下的代码写的还是太少的缘故吧,呵呵...)

<think>好的,我现在需要帮助用户理解Java全局变量和局部变量的区别,包括作用域和生命周期。首先,我要回忆一下相关知识,确保信息准确。根据用户提供的引用内容,全局变量包括实例变量和静态变量,而局部变量是在方法或代码块中定义的。 我需要从作用域和生命周期两个方面来比较这两者。作用域指的是变量在哪里可以被访问,而生命周期则是变量存在的时间范围。局部变量的作用域仅限于定义它的方法或代码块内部,生命周期则是从声明开始到方法或代码块执行结束。而全局变量(实例变量和静态变量)的作用域更广,实例变量属于对象实例,作用域在整个类中,生命周期随对象存在;静态变量属于类,作用域也是整个类,但生命周期从类加载开始到程序结束。 用户可能还会想知道使用时的注意事项,比如局部变量必须初始化,而全局变量有默认值。同时,命名冲突的问题,比如局部变量和全局变量同名时的优先级,这点引用中也提到了局部优先原则,需要解释清楚。 还要注意引用用户提供的资料,比如在解释生命周期时引用[^1],在讨论同名变量时引用[^2]。确保回答结构清晰,分点说明,让用户容易理解。最后生成的相关问题要围绕主题,比如内存管理、最佳实践、默认值问题等,帮助用户进一步学习。</think>### Java全局变量与局部变量的区别 #### 1. **定义位置与作用域** - **全局变量**(实例变量/静态变量): - 定义在类内部、方法外部,例如: ```java public class Example { int instanceVar; // 实例变量(全局变量) static int staticVar; // 静态变量(全局变量) } ``` - **作用域**:整个类内部均可访问。 - **生命周期**: - 实例变量:随对象创建而存在,对象被垃圾回收时销毁[^1]。 - 静态变量:从类加载开始存在,到程序结束时销毁。 - **局部变量**: - 定义在方法、代码块或构造函数内部,例如: ```java public void method() { int localVar = 10; // 局部变量 } ``` - **作用域**:仅限定义它的方法、代码块或构造函数内部。 - **生命周期**:从声明开始,到方法/代码块执行结束时销毁。 --- #### 2. **初始化要求** - **全局变量**: - 无需显式初始化,系统默认赋值(如`int`默认0,`boolean`默认`false`)。 - **局部变量**: - 必须显式初始化,否则编译报错。 --- #### 3. **内存分配** - **全局变量**: - 实例变量存储在堆内存(对象所属区域)。 - 静态变量存储在方法区(类元数据区域)。 - **局部变量**: - 存储在栈内存(方法调用时分配临时空间)。 --- #### 4. **同名优先级** - 若局部变量与全局变量同名,遵循**局部优先原则**,局部变量会覆盖全局变量[^2]。例如: ```java public class Test { int a = 5; // 全局变量 public void print() { int a = 10; // 局部变量 System.out.println(a); // 输出10(局部变量) } } ``` --- #### 5. **使用场景** - **全局变量**: - 需要跨方法共享数据时(如对象状态、类级配置)。 - **局部变量**: - 临时存储中间计算结果或方法内部逻辑控制。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值