在Java中,访问成员变量应优先使用this而非类名:非静态方法中用this避免局部变量遮蔽,内部类用外部类名.this访问外层成员,静态成员才可用类名访问。

在 Java 中,访问成员变量时用 this 还是直接写类名,关键看上下文——尤其是是否处于内部类或匿名类中。两者语义完全不同,不能互换。
普通方法里:用 this 指代当前对象的成员
在非静态方法中,this 是对当前实例的引用。当局部变量(如形参)和成员变量同名时,this.name 明确表示“我要赋值给当前对象的 name 字段”,避免被局部变量遮蔽。
- 不加 this:name = "张三" → 修改的是形参或局部变量,成员变量不变
- 加 this:this.name = "张三" → 正确更新当前对象的成员变量
- 静态方法中不能使用 this,因为静态不属于任何实例
内部类/匿名类中:类名.this 用于访问外部类成员
内部类有自己的 this,它指向内部类自身实例。如果想从内部类访问外部类的同名成员(比如两个类都有 int a),就必须用 外部类名.this.a 来明确指定。
- InnerClass 中的 this.a → 访问的是 InnerClass 自己的 a
- OuterClass.this.a → 访问的是包裹它的 OuterClass 实例的 a
- 匿名类中同样适用,比如 new ActionListener() { public void actionPerformed(...) { OuterClass.this.handleClick(); } }
什么时候根本不用类名或 this?
如果成员变量没有命名冲突,且不在内部类中,直接写变量名即可,编译器会自动按“局部 → 当前类成员 → 父类成员”顺序查找。
- public void setAge(int age) { this.age = age; } —— 推荐写法,清晰、一致
- public void setAge(int age) { age = age; } —— 错误,等于没赋值
- public void print() { System.out.println(age); } —— 合法,无歧义时可省略 this
类名直接访问成员?通常不行
不能写 ClassName.member 来访问非静态成员变量——那会被当作静态访问,编译报错。只有 static 成员才能用类名调用,例如 Math.PI 或 MyClass.COUNT。普通成员必须依托实例,而 this 就是最自然的实例引用方式。

















