【问题标题】:How the compiler and runtime system deal with nested types in java?编译器和运行时系统如何处理 java 中的嵌套类型?
【发布时间】:2013-01-20 02:01:25
【问题描述】:

编译器如何知道嵌套类型,例如:

  • 嵌套内部类
  • 匿名类
  • 嵌套接口

.....等等

需要明确.......

【问题讨论】:

  • 您的问题不清楚。你在写编译器吗?如果没有,你为什么想知道?
  • 我的理解........
  • 请。花时间在其他事情上,比如如何使用它们。不是关于编译器如何找到和区分它们。
  • @Azodious 好奇心是件好事……(不清楚的问题不是!)
  • 是的,我同意,但回答这个问题我觉得没多大用处。但是,对 OP 来说,它可能很有用。

标签: java jvm nested-class anonymous-class anonymous-inner-class


【解决方案1】:

编译器提取内部类并为每个类创建单独的*class 文件。内部类名创建为OuterClassName$InnerClassName。匿名内部类没有名字,所以它们的名字被创建为OuterClassName$1、OuterClassName$2等。

内部类使用语法OuterClassName.this 对外部类的实例有特殊的引用。

由于内部类被编译成单独的类文件,JVM 根本不处理内部类。它处理具有上述“特殊”名称的常规类。

【讨论】:

  • +1 值得注意的是,虽然 Java 支持嵌套类访问同一外部类的私有成员,但 JVM 不支持。编译器所做的是添加名称如access$100 的访问器方法,以使类可以访问共享相同外部类的其他类的私有字段、方法和构造函数。如果您在调用堆栈中看到这些奇怪的方法之一,这就是它的意思。
猜你喜欢
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
相关资源
最近更新 更多