就近原则指变量访问按作用域由内向外查找,一找到即停止;局部变量(含形参)会遮蔽同名成员变量,须用this.访问成员变量,内部类需OuterClass.this访问外部同名字段。

Java 方法里,当局部变量和成员变量同名时,编译器会自动优先使用离当前代码行最近的那个变量——也就是“就近原则”。这不是语法错误,而是一种明确的名称解析规则:它从当前作用域开始往外找,一找到同名变量就停止,不会继续向上搜索。
就近原则怎么起作用
只要方法内声明了和成员变量同名的变量(包括形参、for循环里的int i、if块中的String msg),这个局部变量就会在整个方法体中“遮蔽”同名的成员变量。此时直接写变量名,访问的永远是局部变量。
- 形参也是局部变量,所以
public void setName(String name)里的name一出现,就盖住了成员变量name - 哪怕只在某一行声明,比如
String name = "tmp";,之后整段方法里name都指这个局部值 - 成员变量没被赋值也不报错,但它保持默认值(null、0、false),容易导致逻辑异常却难以察觉
怎么访问被遮蔽的成员变量
必须用this.变量名显式指定。this代表当前对象,加上点号后,编译器就知道你要的是实例字段,而不是眼前这个局部变量。
- 构造方法里常见:
this.name = name;,左边是成员变量,右边是形参 - setter方法里同样适用:
this.age = age; - 静态方法中不能用this,因为没有“当前对象”的概念
内部类和嵌套场景要注意什么
内部类也有自己的成员变量。如果它和外部类同名,内部类默认访问自己的字段;想访问外部类的同名字段,得写OuterClass.this.field。
立即学习“Java免费学习笔记(深入)”;
- 静态嵌套类不支持
OuterClass.this,需通过外部类实例访问 - super.name不是用来解决本类遮蔽问题的,它指向父类字段,和this无关
- 两个并列的if块可以各自声明
int x,互不影响,因为它们不在同一作用域层级
理解就近原则的关键,是把变量访问看作一次“由内向外的查找”,而不是“谁更重要”。写清楚this,不是多此一举,而是让意图可读、行为可控。


















