Java LongAdder扩展了哪个类?

Java LongAdder扩展了哪个类?,java,inheritance,java-8,Java,Inheritance,Java 8,在为LongAdder引用JavaDocs时,它扩展了Number类 然后,在查看源代码时,它是从Striped64扩展而来的 这让我很困惑,为什么我们不能在javadocs中指定从Striped64类扩展而来的LongAdder? 是因为条带64扩展了数字吗 他们可能正在扩展数字类长加法器,谁知道呢? 从Oracle文档: 可以得出结论,通过扩展

在为LongAdder引用JavaDocs时,它扩展了Number

然后,在查看源代码时,它是从Striped64扩展而来的

这让我很困惑,为什么我们不能在javadocs中指定从Striped64类扩展而来的LongAdder?
是因为条带64扩展了数字吗

他们可能正在扩展
数字
长加法器
谁知道呢?

从Oracle文档:

可以得出结论,通过扩展
,使用

Q:为什么Striped64由LongAdder扩展?

A:
Striped64
保存单元格的哈希表(其中每个单元格都是
AtomicLong
)。使用多个线程将值添加到
LongAdder
(它扩展了
Striped64
),然后线程添加它们的值 到该哈希表中的不同单元格。这将导致并发线程 处理并提高吞吐量

可能是条带化的64是一个内部实现,他们希望它被抽象。

LongAdder扩展了哪个类

如源代码所示,它扩展了
Striped64
。但是,由于该类不是公共API,Javadoc不会告诉您这一点


默认情况下,Javadoc只为
public
protected
成员生成文档;换句话说,只有公共API被记录1。
Striped64
类是包私有的,因此没有文档记录。由于该类没有文档化,因此找到了下一个最近的文档化祖先,在本例中正好是
Number
。注意,您可以有一个有15个以上祖先的文档类
Foo
,但是如果这些祖先都不是公共API,Javadoc将显示
Foo扩展对象

从公共API和私有API的角度来看,
LongAdder
扩展了
Striped64
这一事实是不相关的。后一类是实现细节(即私有API)。公共API定义了库的契约;因此,在这种情况下,用户只关心
LongAdder
Number
的子类

如果需要,您可以配置Javadoc来记录所有内容,包括包private和
private
成员。但是,生成的文档可能仅用于私人用途(例如,维护库的组织内部)


一,。API的公共性或私有性并不仅仅取决于可见性修饰符。该类所包含的包也是相关的。例如,JDK在带有前缀的包中有许多类,如
com.sun
oracle
JDK.internal
,等等。这些包中的类是私有API,因此没有在公开的Javadoc中记录


随着模块的出现,“私有包”的概念在Java9中获得了更正式的地位。现在,您可以显式声明哪些包由模块导出,这由运行时强制执行。

因为
Striped64
不是公共API,而
Number
是。另外一个重要的注意事项是,由于Striped64不是公共API,JavaSE的未来版本可以自由更改这种层次结构:LongAdder可以扩展一个完全不同的类,或者直接扩展Number。因此,java.util.concurrent.atomic包之外的任何以任何方式依赖Striped64存在的代码都是断开的代码;
Striped64
非常好,以至于guava和其他一些项目不得不将其复制到它们的库代码中。类似地,
StringBuilder
StringBuffer
显示为扩展
Object
,隐藏它们的公共、非公共基类
AbstractStringBuilder