外部方法中final变量iry改名为i后,内部类方法能否访问该变量?
如何访问被内部类成员遮蔽的方法局部变量
i? 先把你的代码补全并调整问题场景(将iry改为i):
class Outer{ int i = 10; public void m1(){ final int i = 100; // 原iry改为i,现在出现三个同名的i class Inner{ int i= 20; public void innerClassMethod(){ System.out.println(this.i); // 输出内部类的i:20 System.out.println(Outer.this.i); // 输出外部类的i:10 // 怎么访问m1方法里的那个i(值为100)? } } new Inner().innerClassMethod(); } public static void main(String[] args) { new Outer().m1(); } }
问题核心:多重遮蔽的作用域优先级
现在有三个同名的i,它们的作用域优先级从高到低是:
- 内部类的成员变量
i:在内部类方法中直接写i或者this.i都会优先指向它 - 外部类的成员变量
i:可以通过Outer.this.i明确引用 - 外部方法
m1的局部变量i:它被内部类的i完全遮蔽了,Java没有提供直接的语法(比如类似Outer.m1.this.i)来引用它,因为方法不是类/对象,没有对应的this标识符。
可行的解决方案
方案1:给方法局部变量起别名
在内部类定义之前,把方法里的i赋值给一个不同名的final变量,内部类就可以直接访问这个别名:
class Outer{ int i = 10; public void m1(){ final int i = 100; final int methodLocalI = i; // 给方法局部变量i起别名 class Inner{ int i= 20; public void innerClassMethod(){ System.out.println(this.i); // 20 System.out.println(Outer.this.i); // 10 System.out.println(methodLocalI); // 100,成功访问原方法局部变量i } } new Inner().innerClassMethod(); } }
方案2:通过内部类构造方法传递变量
给内部类添加构造方法,把方法局部变量i作为参数传入并保存,之后在内部类方法中访问:
class Outer{ int i = 10; public void m1(){ final int i = 100; class Inner{ int i= 20; private final int methodI; // 构造方法接收方法局部变量i public Inner(int methodI) { this.methodI = methodI; } public void innerClassMethod(){ System.out.println(this.i); // 20 System.out.println(Outer.this.i); // 10 System.out.println(this.methodI); // 100 } } new Inner(i).innerClassMethod(); // 传入方法局部变量i } }
这两种方法都能绕开遮蔽问题,成功访问到方法里的那个i变量。
内容的提问来源于stack exchange,提问作者Deep Roy
相关产品推荐
相关产品推荐

