局部内部类怎么访问其方法的同名变量? 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(); } } 萌新人傻了,复习局部内部类的时候突然整不明白了 虽然可以通过定义其他的变量名称来规避这种麻烦,但还是想搞明白,求大佬解惑
1
ZredoC OP |
2
ZredoC OP 贴不了代码。。蛋疼
|
3
ZredoC OP ```
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(); } } ``` |
4
amiwrong123 2019-10-13 20:04:48 +08:00
|
5
amiwrong123 2019-10-13 20:06:43 +08:00
提问前记得百度,网上博客一大堆
|
6
amiwrong123 2019-10-13 20:14:30 +08:00
不好意思,我看错了。我觉得好像没法访问吧。。应该外部类方法的 n 只是一个局部变量。而内部类只是说可以直接调用到外部类对象的成员,一个局部变量也不是个外部类的成员啊
|
7
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。 个人见解,用内部类也不多,如果有错希望有大牛能够指出来。 |
8
ZredoC OP @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(); } } ``` |