参数遮蔽是指方法参数与类字段同名导致字段被隐藏,编译器优先使用局部变量,使 name = name; 无效;应使用 this.name 明确访问字段。

在 Java 中,当方法参数名与类的成员变量(字段)同名时,参数会“遮蔽”字段,导致直接访问该名称时取到的是参数值而非字段值。此时用 this 关键字可明确指代当前对象的字段,从而解决遮蔽问题。
什么是参数遮蔽(Shadowing)?
参数遮蔽是指局部变量(如方法参数)与类字段重名,导致字段被“隐藏”。编译器默认优先使用局部作用域中的变量,因此不加修饰地写 name = name; 实际是把参数赋给自己,字段根本没被修改。
- 例如:
private String name;和public void setName(String name) { name = name; }—— 这行赋值毫无效果。 - Java 允许这种命名,但逻辑上容易出错,属于常见低级 bug 来源。
用 this 明确访问当前对象的字段
this 是对当前对象的引用,this.name 就表示当前实例的 name 字段,与参数 name 区分开。
- 正确写法:
public void setName(String name) { this.name = name; } -
this.只在存在命名冲突时才必须;无冲突时可省略,但加上更清晰、更规范。 - 构造方法中也常用:
public Person(String name, int age) { this.name = name; this.age = age; }
其他避免遮蔽的常见做法
除了 this,还可从命名层面预防遮蔽,提升代码可读性。
- 参数加前缀:如
setName(String newName)或setName(String aName) - 字段加下划线:
private String _name;(部分团队风格) - IDE(如 IntelliJ)通常会高亮遮蔽字段,并提示“Field can be accessed directly”,建议及时修正
this 的其他合法用途(补充说明)
虽然本题聚焦于解决遮蔽,但需注意 this 还有其它正当用法,不要误用或滥用:
- 调用本类另一个构造方法:
this("default");(必须是第一行) - 将当前对象作为参数传递:
listener.onEvent(this); - 在内部类中引用外部类实例:
OuterClass.this.field - 不能在静态上下文中使用 this(因为静态方法不依赖具体实例)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











