【问题标题】:Inner Class in JavaJava中的内部类
【发布时间】:2017-05-09 07:12:36
【问题描述】:

我正在阅读学习 Java 中的内部类。我找到了这段代码

class Animal{
   class Brain{
   }
}

编译后,javap 'Animal$Brain' 输出为

Compiled from "Animal.java"class 
Animal$Brain {
    final Animal this$0;
    Animal$Brain(Animal);
}

它解释了内部类如何在内部类构造函数中获取对其封闭实例的引用。但是当我像这样将内部类定义为私有时

class Animal{
   private class Brain{
   }
}

然后在编译后,javap 'Animal$Brain' 给出的输出为

Compiled from "Animal.java"
class Animal$Brain {
    final Animal this$0;
}

那么为什么输出不同呢? 为什么没有显示内部类构造函数? 在后一种情况下,内部类也正在获取封闭类实例的引用。

【问题讨论】:

  • 我猜是因为类的公共构造函数已经消失(你现在不能在外部做new Animal().new Brain();)。

标签: java inner-classes javap


【解决方案1】:

好问题。根据this

如果不使用任何选项,javap 会打印出传递给它的类的包、保护和公共字段和方法

由于您已将Brain 声明为私有内部类,其默认构造函数将隐式设为私有,因此在Animal 类之外将不可见。

参考:http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9

【讨论】:

  • 由于 javap 打印传递给它的类的默认、保护和公共字段和方法,并且它不打印内部类构造函数,因此暗示内部类构造函数是私有的。
【解决方案2】:

默认情况下,javap 打印类的非私有成员。

您可以使用 -p 选项来显示所有类和成员。

//javap -p 'Animal$Brain.class'

Compiled from "Animal.java"
class Animal$Brain {
  final Animal this$0;
  private Animal$Brain(Animal);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2023-01-24
    相关资源
    最近更新 更多