You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

外部方法中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,它们的作用域优先级从高到低是:

  1. 内部类的成员变量i:在内部类方法中直接写i或者this.i都会优先指向它
  2. 外部类的成员变量i:可以通过Outer.this.i明确引用
  3. 外部方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:03:17