Cha*_*ngh 3 java inheritance java-8
在为LongAdder引用JavaDocs时,它扩展了Number类。
然后,在查看源代码时,它是从Striped64扩展的
这让我很困惑,为什么我们不能在javadocs中指定从Striped64类扩展的LongAdder?是因为Striped64扩展了Number吗?
LongAdder扩展哪个类?
如源代码所示,它扩展了Striped64。但是,由于该类不是公共API,因此Javadoc不会告诉您。
默认情况下,Javadoc只为public和protected成员生成文档。换句话说,仅记录了公共API 1。该Striped64班是包私人和因此没有记录。由于未记录该类,因此找到了下一个最近记录的祖先,Number在这种情况下恰好如此。请注意,您可能有一个Foo包含15个以上祖先的文档类,但是如果这些祖先都不是公共API,则Javadoc将显示Foo extends Object。
从公共API与私有API的角度来看,事实的LongAdder扩展Striped64是无关紧要的。后者是实现细节(即私有API)。定义库合同的是公共API。因此LongAdder,Number在这种情况下,用户只关心它的子类。
private如果需要,您可以配置Javadoc以记录所有内容,包括私有软件包和成员。但是,生成的文档可能应该仅供私人使用(例如,维护该库的组织内部)。
1.使API公开或私有的原因并不仅仅基于可见性修饰符。该类所在的包也很重要。例如,JDK有很多类在包中带有前缀,如com.sun,oracle,jdk.internal,等。这些软件包中的类是私有API,因此未在可公开获得的Javadoc中进行记录。
随着模块的出现,“私有软件包”的想法在Java 9中获得了更多的官方地位。现在,您可以显式声明模块导出了哪些包,并且由运行时强制执行。