本文记录鄙人在开发中遇到的一个实例,以此说明使用局部变量和全局变量的区别
局部变量和全局变量在编程中扮演着不同的角色,它们之间在定义、作用域、内存存储方式、生命期以及使用方式等方面存在显著的区别。
局部变量与全局变量的区别
- 定义与作用域
- 局部变量:在函数或复合语句内部定义的变量,其作用域被限制在定义它的函数或复合语句内部。这意味着局部变量只能在其所在的函数或复合语句中被访问和修改。
- 全局变量:在函数外部定义的变量,其作用域从定义点开始,一直延伸到整个源文件的末尾。全局变量可以被源文件中的任何函数或复合语句访问和修改。
- 内存存储方式
- 局部变量:通常存储在栈(Stack)内存中。栈是一种后进先出(LIFO)的数据结构,用于存储程序运行时函数调用的上下文信息,包括局部变量、函数参数等。当函数被调用时,会为其局部变量分配栈空间;当函数返回时,这些空间会被自动释放。
- 全局变量:存储在全局数据区(或静态数据区)中。这个区域在程序启动时被分配,并在程序结束时被释放。全局变量的生命周期贯穿整个程序运行期间。
- 生命期
- 局部变量:随函数的调用而创建,随函数的返回而销毁。一旦函数执行完毕,其内部定义的局部变量就会被释放,不再可用。
- 全局变量:从程序开始执行到程序结束一直存在。全局变量的生命周期与程序本身相同。
- 使用方式
- 局部变量:只能在定义它的函数或复合语句内部使用。由于其作用域的限制,局部变量不会与其他函数中的同名变量产生冲突。
- 全局变量:可以在程序的任何地方被访问和修改,这使得全局变量在跨函数数据共享方面非常有用。但是,过度使用全局变量会导致程序的可读性和可维护性降低,因此应谨慎使用。
实例:
private static final long CLICK_INTERVAL = 3000; //3秒
private long startClickTime = -1L; //第一次点击时间
private int clickCount = 0; //点击次数计数器
//3秒内点击5次,执行***
private void handleClicks() {
long currentTime = System.currentTimeMillis();// 获取当前时间
if (startClickTime == -1L || currentTime - startClickTime > CLICK_INTERVAL) {
//重新开始计时
startClickTime = currentTime;
clickCount = 1;
} else {
clickCount++;
}
if (clickCount==5 ) {
// 其他逻辑
clickCount = 0;
startClickTime = -1L;
}
}
问题:
long currentTime 可以写在handleClicks()方法外面吗? 方法里只写currentTime = System.currentTimeMillis()
答:
将 long currentTime = System.currentTimeMillis();
写在 handleClicks()
方法外面是可以的,但要注意这样做的影响:
- 方法外部: 如果你把
currentTime
声明在handleClicks()
方法外面(例如在类的成员变量中),它会变成类的成员变量。每次调用handleClicks()
方法时,这个变量的值不会被重新赋值为当前时间,导致你可能无法获得正确的时间戳。 - 方法内部:
currentTime
作为局部变量在handleClicks()
方法内部声明和赋值是更安全的做法。这样每次调用handleClicks()
时,currentTime
都会获得最新的系统时间,确保时间比较的准确性。
总结
建议: 将 currentTime
声明为局部变量在 handleClicks()
方法内部。这样可以确保每次调用方法时获得最新的时间戳,避免可能的错误。