首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  Java

[不懂就问]局部内部类怎么访问其外部方法的同名变量?

  •  
  •   ZredoC · 62 天前 · 622 次点击
    这是一个创建于 62 天前的主题,其中的信息可能已经有所发展或是发生改变。

    局部内部类怎么访问其方法的同名变量? public class Outer { public void methodOuter() { int n = 100; class Inner { int n = 10; public void methodINner() { int n = 29; System.out.println("局部内部类的方法的 n:"+n); System.out.println("局部内部类的 n:"+this.n); System.out.println("外部类方法的 n:"+____); } } Inner i = new Inner(); i.methodINner(); } } 萌新人傻了,复习局部内部类的时候突然整不明白了 虽然可以通过定义其他的变量名称来规避这种麻烦,但还是想搞明白,求大佬解惑

    9 回复  |  直到 2019-10-15 13:49:30 +08:00
        2
    ZredoC   62 天前
    贴不了代码。。蛋疼
        3
    ZredoC   62 天前
    ```
    public class Outer {
    public void methodOuter() {
    int n = 100;
    class Inner {
    int n = 10;
    public void methodINner() {
    int n = 29;
    System.out.println("局部内部类的方法的 n:"+n);
    System.out.println("局部内部类的 n:"+this.n);
    System.out.println("外部类方法的 n:"+____);
    }
    }
    Inner i = new Inner();
    i.methodINner();
    }
    }
    ```
        5
    amiwrong123   62 天前
    提问前记得百度,网上博客一大堆
        6
    amiwrong123   62 天前
    不好意思,我看错了。我觉得好像没法访问吧。。应该外部类方法的 n 只是一个局部变量。而内部类只是说可以直接调用到外部类对象的成员,一个局部变量也不是个外部类的成员啊
        7
    vwym   60 天前
    当你在内部类中时,会自动把局部变量 A 复制一份成 B。
    如果你是基本类型或者 final 修饰的类,当你每一次重新赋值的时候,直接修改 B,所以 final 修饰的类如 String、Integer 的修改是无法影响到 A 的。
    如果局部变量 A 是一个普通类,那么传递的是地址,所有内部类中直接是不允许你直接对该实例重新初始化,但是可以使用该实例。
    当然,当你重新声明与 A 同名的变量,那么直接是将声明实例后的结果覆盖掉 B。
    所以说,当你在内部类中执行了'int n = 29;'后,是拿不到外部方法的 n,是因为你自己在内部类中用同名变量覆盖掉复制到内部类的结果 B。
    个人见解,用内部类也不多,如果有错希望有大牛能够指出来。
        8
    ZredoC   60 天前
    @amiwrong123
    是可以访问的。。只是没有办法访问外部类方法内的 [同名] 局部变量,所以只能在赋值时改一下变量名尽量不要重名。
    外部类里的成员变量可以直接类名.this.变量名访问,局部内部类要访问外部类方法的局部变量的话,外部类方法的局部变量加上 final 就可以直接访问了,而且从 java8 开始,只要该局部变量事实不变,final 可以省略掉了
    ```
    public class Outer {
    int a = 30;
    public void methodOuter() {
    int a = 100;
    class Inner {
    int n = 10;
    public void methodINner() {
    int n = 29;
    System.out.println("局部内部类的方法的 n:"+n); //29
    System.out.println("局部内部类的 n:"+this.n); //10
    System.out.println("外部类方法的 n:"+a); //100
    System.out.println("外部类的 n:" +Outer.this.a); //30
    }
    }
    Inner i = new Inner();
    i.methodINner();
    }
    }
    ```
        9
    ZredoC   60 天前
    @vwym 感谢解答
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1105 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 18:33 · PVG 02:33 · LAX 10:33 · JFK 13:33
    ♥ Do have faith in what you're doing.