
在java匿名内部类中,可直接访问其继承自抽象父类的public或包级可见成员变量,无需特殊语法;但需注意引用有效性,避免空指针异常。
在java匿名内部类中,可直接访问其继承自抽象父类的public或包级可见成员变量,无需特殊语法;但需注意引用有效性,避免空指针异常。
在Java中,当通过new A() { ... }创建匿名子类实例时,该匿名类继承自抽象类 A,因此它天然拥有 A 中声明的非私有成员(如 public int var)。此时访问 var 的方式有三种,且语义略有区别:
- ✅
var:最简洁,直接使用——编译器自动解析为当前匿名类实例继承的var字段(即this.var的简写); - ✅
this.var:显式表明访问的是当前匿名类实例自身的var(因继承而存在); - ⚠️
a.var:仅当a非 null 且指向当前正在执行的匿名类实例本身时才安全(例如a = this),否则极易引发NullPointerException或逻辑错误。
以下为正确用法示例:
abstract class A {
public int var = 42;
public abstract void fun();
}
class B {
private A a;
public B() {
a = new A() {
@Override
public void fun() {
System.out.println(var); // ✅ 推荐:简洁、清晰、安全
System.out.println(this.var); // ✅ 等价,强调实例归属
// System.out.println(a.var); // ❌ 危险!此时 a 尚未完成赋值(构造中),或可能为 null
}
};
}
public A getA() { return a; }
}
// 测试
public class Main {
public static void main(String[] args) {
B b = new B();
b.getA().fun(); // 输出:42
}
}
⚠️ 关键注意事项:
- 匿名类不是“闭包”,它不捕获外部局部变量以外的
this引用;此处var是继承所得,而非从外部B类闭包获取; - 切勿在匿名类方法中通过外部字段(如
B.this.a.var)间接访问——这既冗余又脆弱,且违背封装意图; - 若
var被声明为private,则匿名类无法直接访问(继承失败),需改为protected、public或包内可见(无修饰符); - 构造阶段
a尚未完成赋值,此时在匿名类中引用a.var属于未定义行为,JVM 可能抛出NullPointerException。
✅ 总结:优先使用裸名 var 或 this.var 访问继承的成员变量;避免依赖尚未就绪的外部引用。这是面向对象继承机制的自然体现,而非特殊语法技巧。










