Java中Class的内在与外在的关系?

Relationship between Inner and Outer Class in Java?

这是我的 Book.java 代码

public class Book {
    private int pageNumber;

    private class BookReader{
        public int getPage(){
            return pageNumber;
        }
    }
}

当我编译并使用 javap 时,我得到了两个 类

的以下内容

对于Book$BookReader.class

这是输出代码

Compiled from "Book.jav
class Book$BookReader {
  final Book this[=13=];
  public int getPage();
}

我的问题是为什么在此处进行任何引用时添加 final 以及为什么进行此引用?它在内部类中有什么用?

对于Book.class

$ javap Book.class
Compiled from "Book.java"
public class Book {
  public Book();
  static int access[=14=]0(Book);
}

为什么变量要加static,这里为什么传Book为参数?

可以的话请简单说明!

非静态内部 class 具有对其父实例的引用。那就是

final Book this[=10=];

无法在 运行 时更改对父 Book 实例的引用,这就是为什么它是最终的。也就是说,您的 BookReader 精确地引用了在构建时分配的 Book,以后无法更改。

行:

static int access[=11=]0(Book);

是包级静态访问器方法。它用于允许内部 class 访问外部的私有成员。

您通过以下方式定义 BookReader

class Book {
    private class BookReader {  }
}

这个 class 依赖于正在创建的 Book 实例,因此编译器创建引用并使其成为最终的(这是一个优化,因为每个 Book 实例都可以创建 BookReader)

如果您通过以下方式定义 BookReader

class Book {
    private static class BookReader {  }
}

那么引用将不存在,因为 Book reader 可以在没有 Book 实例的情况下创建。

here

BookReader 中,final 变量 this[=12=] 将保存对包含 Book 实例的 BookReader 的引用。这是 final,因为它是在每个 BookReader 实例创建时根据其创建方式确定的,此后无法更改。

在classBook中,静态方法access[=18=]0是一个综合访问器方法,有利于classBook.BookReader。作为 Book 的内部 class,每个 BookReader 都可以访问其包含实例的成员变量,但 Java 运行时实际上并不知道这一点,并且 class 文件格式没有特殊表示。

为了 BookReader 能够访问 private 成员 Book.pageNumber,因此,编译器生成一个合成的默认访问方法为此,在 class Book 中,在 BookReader 中,根据该方法写入对外部 class 变量的访问。