在内部类中访问外部类变量

36
在内部类中,外部类的变量是可以访问的,但方法的局部变量不行。我理解方法的局部变量不可访问,但我想知道为什么外部类变量是可访问的?
我的理解是内部类与外部类绑定,只要父类可用,子类就可以访问其父类的变量。我的理解正确吗?

1
静态内部类还是非静态的? - Duncan Jones
3
@DuncanJones:内部类始终是非静态的。看这里... http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html - Vishal K
2
@VishalK 谢谢,我多年来一直错误地称嵌套类为“内部类”。哎呀! - Duncan Jones
我认为这篇文章比楼主提问的时间晚了,但它是一个很好的参考资料。https://www.programiz.com/java-programming/nested-inner-class - Jacqueline P.
2个回答

64
假设您的外部类被称为Outer,从内部类(非静态)的作用域中,使用Outer.this.foo来获取该字段。 例如,
Outer.this.foo=new ArrayList<>();

Outer是类的名称,foo是字段的标识符。

如果由于变量屏蔽而存在命名冲突,则您还可以直接获取它,例如foo = new Baz(),但它将选择内部字段。

如果它是一个静态内部类,您需要明确指定实例:

outerInstance.foo=new ArrayList<>();

或者,如果要访问的字段是静态的,请像平常一样进行访问:

Outer.staticFoo=new ArrayList<>();

嗨,感谢回复。我的问题是,如果内部类和外部类同时使用变量,可能会出现并发问题。但是,内部类使用变量的方式就像一个类的两个方法使用变量一样。因此,我们需要使用同步来处理内部类的情况。 - kiran
1
@user5 不需要进行任何其他同步,内部和外部类不会导致新线程的创建。 - nanofarad

2

答案:在Java中,外部类变量是可访问的,因为它们遵循词法作用域规则。

什么是词法作用域?

按照代码编写的顺序定义范围。假设您的类结构如下:

OuterMost  
   --Inner  
     --InnerMost

那么最内层的类将能够访问来自最外层和内层的变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接