成员变量
-
声明在类内部,但在方法、构造器或代码块之外的变量。
-
属于类的实例(对象)或类本身(静态变量)。
实例变量(非静态成员变量):
public class Person {
private String name; // 实例变量(非静态)
private int age;
}
静态变量(用static修饰):
public class Person {
private static String species = "Human"; // 静态变量
}
-
作用域:整个类内部(所有方法、构造器均可访问)
-
初始化:成员变量有默认值(如
int
默认0
,对象类型默认null
) -
访问权限:可通过访问修饰符(
public
/private
/protected
)控制
局部变量
声明在方法、构造器或代码块内部的变量。
主要类型:
方法局部变量:
public void printInfo() {
String info = "Hello"; // 方法局部变量
System.out.println(info);
}
代码块局部变量(如循环、if
语句):
for (int i = 0; i < 5; i++) { // i 是代码块局部变量
System.out.println(i);
}
形参(方法参数):
public void setName(String name) { // name 是形参(局部变量)
this.name = name;
}
作用域:仅限于声明它的代码块内部
示例:
public void test() {
int x = 10;
if (x > 5) {
int y = 20; // y 只在 if 块内有效
System.out.println(y);
}
System.out.println(y); // ❌ 在这里就会编译错误:y 超出作用域
}
没有默认值,必须赋值后才能使用;
访问权限:只能在声明它的代码块内访问,无法用修饰符(如 public
)
区别 | 成员变量 | 局部变量 |
类中位置不同 | 在类中,方法的外面 | 在方法内,方法申明上 |
初始值不同 | 有默认初始化值 | 没有,需要先赋值再使用 |
内存位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 对象在就在,对象消失就消失 | 方法在就在,方法运行结束就消失 |
作用域 | 整个类 | 当前方法中 |
就近原则
当方法或代码块中定义的局部变量与类的成员变量(实例变量)同名时,Java 会优先使用最近的变量(即局部变量),这种现象称为 "就近原则"。
表现:
-
直接访问同名变量时,默认操作的是局部变量
-
成员变量会被局部变量 "遮蔽"(Shadowing)
示例:
public class Student {
private String name; // 成员变量
public void setName(String name) { // 局部变量 name
name = name; // ❌ 问题:就近原则导致左右都是局部变量
}
public String getName() {
return name;
}
}
调用 setName("Tom")
后,成员变量 name
的值仍然是 null
,因为赋值操作实际是 局部变量 = 局部变量
。
解决方法:
this关键词
当成员变量与局部变量同名时,用 this.变量名
明确指定成员变量
public void setName(String name) {
this.name = name; // ✅ 正确:this.name 指向成员变量
}
返回 this
还可以实现方法链式调用
public Student setAge(int age) {
this.age = age;
return this; // 返回当前对象
}
// 使用示例
student.setName("Tom").setAge(20);
注意事项
静态方法中不能使用 this
因为 this
指向对象实例,而静态方法属于类,不依赖实例
This应用示例:
public class Person {
private String name; // 成员变量
public void setName(String name) { // 局部变量
this.name = name; // 用 this 区分成员变量和局部变量
}
public void printInfo() {
String name = "Local"; // 局部变量
System.out.println(name); // 输出 "Local"(就近原则)
System.out.println(this.name); // 输出成员变量的值
}
public static void main(String[] args) {
Person person = new Person();
person.setName("Alice");
person.printInfo();
}
}
总结
解释成员与局部变量,由此引入就近原则与this介绍,方便更好地运用变量。