Runnable中使用this无法访问外部类实例变量的问题排查
问题解析:Java匿名内部类中
this的指向问题 嘿,这个问题其实戳中了Java内部类里this关键字的一个常见误区,我来给你理清楚前因后果~
核心问题:匿名内部类里的this指向谁?
你写的Runnable是一个匿名内部类,在这个内部类的代码块里,this默认指向的是这个匿名内部类的实例(也就是Runnable的子类对象),而不是外部的Hello类实例。这就是为什么this.truth会编译报错——因为Runnable类里根本没有truth这个变量,编译器找不到它。
你提到“打印this后发现它是Hello类的实例”,这应该是你搞错了打印的位置:
- 如果是在
Hello的构造方法里直接打印this,那确实是Hello的实例; - 但如果是在
run()方法里打印this,输出会是类似Hello$1@xxxx的格式(Hello$1就是Java给匿名内部类自动生成的类名),这才是那个Runnable子类的实例。
为什么直接写truth就能正常运行?
当你在匿名内部类里直接引用truth时,编译器会自动帮你把它解析为Hello.this.truth——也就是明确指向外部Hello类实例的truth变量。因为这个匿名内部类是定义在Hello的构造方法里的成员内部类,它有权限访问外部类的私有实例变量。
两种清晰的修正写法
如果你想让代码更直观,避免歧义,有两种写法都可以:
- 显式指定外部类的
this:
if (Hello.this.truth) { System.out.println("i declare the truth!"); }
- 直接使用变量名(编译器会自动补全外部类的
this):
if (truth) { System.out.println("i declare the truth!"); }
总结一下this的规则
- 在外部类的代码中,
this指向外部类的实例; - 在成员内部类(包括匿名内部类)中,默认的
this指向内部类自己的实例;如果要访问外部类的实例,必须用外部类名.this来明确指定。
内容的提问来源于stack exchange,提问作者GregarityNow
相关产品推荐
相关产品推荐

