【问题标题】:Relationship between Inner and Outer Class in Java?Java中内部类和外部类的关系?
【发布时间】:2015-03-17 13:35:52
【问题描述】:

这是我的 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$0;
  public int getPage();
}

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

对于Book.class

$ javap Book.class
Compiled from "Book.java"
public class Book {
  public Book();
  static int access$000(Book);
}

为什么要为变量添加静态以及为什么在这里将 Book 作为参数传递?

如果可能的话,请用简单的语言解释一下!

【问题讨论】:

标签: java class javap


【解决方案1】:

BookReader 中,final 变量this$0 将持有对包含Book 实例的BookReader 的引用。这是final,因为它是在每个BookReader 实例创建时根据其创建方式确定的,并且此后不能更改。

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

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

【讨论】:

    【解决方案2】:

    您通过以下方式定义BookReader

    class Book {
        private class BookReader {  }
    }
    

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

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

    class Book {
        private static class BookReader {  }
    }
    

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

    here

    【讨论】:

      【解决方案3】:

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

      final Book this$0;
      

      对父 Book 实例的引用不能在运行时更改,这就是它是 final 的原因。也就是说,您的 BookReader 具有对 Book 的引用,该引用是在构造时分配的,以后无法更改。

      行:

      static int access$000(Book);
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-14
        • 1970-01-01
        • 2023-01-24
        • 1970-01-01
        • 2013-04-26
        • 2011-03-10
        • 1970-01-01
        相关资源
        最近更新 更多