为什么内部类的private变量可被外部类直接访问?

哈哈貌似有大神误解了我的意思,我的意思是外部类通过内部类对象访问内部类私有变量,是怎么做到的? [图片]
关注者
147
被浏览
78,644

13 个回答

题主以后请直接把例子的代码以文本形式放到问题描述中。截图的话等于迫使别人再打一次字…虽然截图已经比手机拍照要好了orz

题主问的代码是像这样的:

public class Outer {
  private int outProp = 8;
  class Inner {
    private int inProp = 5;
  public void accessInnerProp() {
    System.out.println(new Inner().inProp);
  public static void main(String[] args) {
    Outer p = new Outer();
    p.accessInnerProp();

Java语言规范里只说了enclosing class可以访问inner class的private/protected成员,inner class也可以访问enclosing class的private/protected成员,但是没有规定死要如何实现这种访问。

JVM规范则在大多数时候都把每个Class都看作等价于top-level的,也就是说不关心enclosing / inner class之间的嵌套关系。对JVM来说,enclosing class和inner class在大部分情况下都是“不相关的两个类”,所以它们之间相互是不能访问对方的private/protected成员的。

在实现中,衔接Java语言规范与JVM规范的就是Java源码级编译器(例如javac、ECJ等)。既然规范没规定死要如何实现,各个编译器都可以自己发明自己的办法。下面就说说javac的做法。

javac会把上面的代码解糖为类似下面的形式:

public class Outer {
  private int outProp;
  public Outer() {
    super();
    this.outProp = 8;
  public void accessInnerProp() {
    System.out.println(Outer$Inner.access$000(new Outer$Inner(this)));
  public static void main(String[] args) {
    Outer p = new Outer();
    p.accessInnerProp();
class Outer$Inner {
  private int inProp;
  final /* synthetic */ Outer this$0;
  Outer$Inner(Outer outer) {
    this.this$0 = outer;
    super();
    this.inProp = 5;