Java 中的变量、常量与作用域详解
一、变量(Variables)
变量是程序中存储数据的基本单元,其值在程序运行过程中可以改变。
1. 变量的声明与初始化
• 声明语法:数据类型 变量名;
int age; // 声明一个整型变量
double price; // 声明一个双精度浮点型变量
• 初始化:变量可以在声明时直接赋值,或后续赋值。
int age = 25; // 声明并初始化
String name = "Alice"; // 字符串变量
2. 变量的分类
-
成员变量(实例变量)
• 定义在类内部、方法外部,属于对象实例的变量。
• 生命周期:随对象创建而存在,对象被回收时销毁。
• 默认值:未显式初始化时,系统自动赋予默认值(如int
为0
,boolean
为false
)。public class Person { String name; // 成员变量,默认值为 null int age; // 默认值为 0 }
-
局部变量
• 定义在方法、代码块或构造函数内,仅在当前作用域有效。
• 生命周期:方法/块执行时存在,执行完毕销毁。
• 必须显式初始化:未赋值的局部变量会编译报错。void calculate() { int result; // 错误!局部变量未初始化 int sum = 10; // 正确 }
-
静态变量(类变量)
• 使用static
修饰,属于类本身,所有对象共享。
• 生命周期:随类的加载而存在,程序结束时销毁。
• 默认值:同成员变量。public class Counter { static int count = 0; // 静态变量 }
二、常量(Constants)
常量是不可变的值,一旦赋值后不可修改。
1. 常量的定义
• 使用 final
关键字声明,通常全大写命名,单词间用下划线分隔。
final double PI = 3.14159; // 常量PI
final int MAX_SIZE = 100; // 常量MAX_SIZE
final String DEFAULT_NAME = "John"; // 字符串常量
2. 常量的初始化
• 声明时赋值:
final int DAYS_IN_WEEK = 7;
• 构造方法/静态块中赋值(针对类常量):
public class Config {
final int MAX_USERS;
public Config() {
MAX_USERS = 100; // 在构造方法中初始化
}
}
3. 静态常量
• 使用 static final
修饰,表示类级别的不可变值。
public class MathConstants {
static final double PI = 3.14159; // 静态常量
}
三、作用域(Scope)
作用域指变量/常量在代码中的可见范围。
1. 类作用域
• 成员变量:在整个类内部可见,可被所有方法访问。
• 静态变量:通过类名直接访问(如 ClassName.staticVar
)。
2. 方法作用域
• 局部变量:仅在声明它的方法内部可见。
void methodA() {
int x = 5; // 仅在methodA中可见
}
void methodB() {
// System.out.println(x); // 错误!x不可见
}
3. 块作用域
• 代码块(如循环、条件语句):变量仅在该块内可见。
for (int i = 0; i < 10; i++) {
System.out.println(i); // i仅在循环体内可见
}
// System.out.println(i); // 错误!i超出作用域
4. 作用域覆盖规则
• 内部块覆盖外部同名变量:
int x = 10;
{
int x = 20; // 编译错误!同一作用域不可重复定义
}
• 不同作用域允许同名变量:
void func1() {
int x = 5;
}
void func2() {
int x = 10; // 合法,不同作用域
}
四、关键注意事项
-
局部变量必须显式初始化:
void test() { int a; // 错误!未初始化 int b = 10; // 正确 }
-
常量只能赋值一次:
final int MAX; MAX = 100; // 正确 MAX = 200; // 错误!不可二次赋值
-
避免作用域冲突:
• 避免在同一作用域内重复定义变量。
• 避免在内部块中定义与外部块同名的变量(除非必要)。 -
参数的作用域:
• 方法参数在整个方法体内有效。void printMessage(String message) { // message在方法内可见 System.out.println(message); }
五、示例代码
public class ScopeExample {
static final int MAX = 100; // 静态常量
int instanceVar = 20; // 成员变量
public static void main(String[] args) {
int localVar = 30; // 局部变量
final int MIN = 1; // 局部常量
if (localVar > MIN) {
int blockVar = 40; // 块作用域变量
System.out.println(blockVar); // 输出40
}
// System.out.println(blockVar); // 错误!blockVar不可见
ScopeExample obj = new ScopeExample();
System.out.println(obj.instanceVar); // 输出20
System.out.println(MAX); // 输出100
}
}
六、总结
• 变量:分成员变量、局部变量、静态变量,作用域和生命周期不同。
• 常量:用 final
定义,不可修改,命名全大写。
• 作用域:类、方法、块三级,遵循“就近访问”原则。
• 关键规则:局部变量必须初始化,常量仅一次赋值,避免作用域冲突。