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 变量的访问。
这是我的 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 变量的访问。