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

2019-10-13 15:21:48 +08:00
 ZredoC

局部内部类怎么访问其方法的同名变量? 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(); } } 萌新人傻了,复习局部内部类的时候突然整不明白了 虽然可以通过定义其他的变量名称来规避这种麻烦,但还是想搞明白,求大佬解惑

2897 次点击
所在节点    Java
9 条回复
ZredoC
2019-10-13 15:34:17 +08:00
ZredoC
2019-10-13 15:34:43 +08:00
贴不了代码。。蛋疼
ZredoC
2019-10-13 15:50:04 +08:00
```
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();
}
}
```
amiwrong123
2019-10-13 20:04:48 +08:00
amiwrong123
2019-10-13 20:06:43 +08:00
提问前记得百度,网上博客一大堆
amiwrong123
2019-10-13 20:14:30 +08:00
不好意思,我看错了。我觉得好像没法访问吧。。应该外部类方法的 n 只是一个局部变量。而内部类只是说可以直接调用到外部类对象的成员,一个局部变量也不是个外部类的成员啊
vwym
2019-10-15 10:38:34 +08:00
当你在内部类中时,会自动把局部变量 A 复制一份成 B。
如果你是基本类型或者 final 修饰的类,当你每一次重新赋值的时候,直接修改 B,所以 final 修饰的类如 String、Integer 的修改是无法影响到 A 的。
如果局部变量 A 是一个普通类,那么传递的是地址,所有内部类中直接是不允许你直接对该实例重新初始化,但是可以使用该实例。
当然,当你重新声明与 A 同名的变量,那么直接是将声明实例后的结果覆盖掉 B。
所以说,当你在内部类中执行了'int n = 29;'后,是拿不到外部方法的 n,是因为你自己在内部类中用同名变量覆盖掉复制到内部类的结果 B。
个人见解,用内部类也不多,如果有错希望有大牛能够指出来。
ZredoC
2019-10-15 13:47:40 +08:00
@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();
}
}
```
ZredoC
2019-10-15 13:49:30 +08:00
@vwym 感谢解答

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/608858

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX