Java 合规期间是否合并了包(共享名称)?

Java 合规期间是否合并了包(共享名称)?,java,inheritance,compilation,package,package-private,Java,Inheritance,Compilation,Package,Package Private,我几乎可以肯定这个问题已经被问到了,但我不确定该寻找什么 无论如何,我很好奇是否有可能创建一个扩展ByteBuffer的类。我认为这是不可能的,因为ByteBuffer有包私有构造函数: // package-private ByteBuffer(int mark, int pos, int lim, int cap, byte[] hb, int offset) { super(mark, pos, lim, cap); this.hb = hb; this.offse

我几乎可以肯定这个问题已经被问到了,但我不确定该寻找什么

无论如何,我很好奇是否有可能创建一个扩展
ByteBuffer
的类。我认为这是不可能的,因为
ByteBuffer
有包私有构造函数:

// package-private
ByteBuffer(int mark, int pos, int lim, int cap, byte[] hb, int offset) {
    super(mark, pos, lim, cap);
    this.hb = hb;
    this.offset = offset;
}

// Creates a new buffer with the given mark, position, limit, and capacity
//
ByteBuffer(int mark, int pos, int lim, int cap) { // package-private
    this(mark, pos, lim, cap, null, 0);
}
然而,我发现,如果您在一个与父类共享名称的包中创建类,那么它可以完美地编译

package java.nio;

public class Test extends ByteBuffer {
    Test(int mark, int pos, int lim, int cap, byte[] hb, int offset) {
        super(mark, pos, lim, cap, hb, offset);
    }

    @Override
    public ByteBuffer slice() {
        return null;
    }

    ...
}   
它也可以在Java 9和Java 10中编译,但只有在编译时使用
--patch module
时:

javac --patch-module java.base=. java/nio/Test.java
我的问题是:这是如何(以及为什么)编译的

合规期间是否合并了包(共享名称)

不完全是。包名称唯一标识包。每个名字只有一个

但是包的成员的Java源代码不必全部驻留在同一个源代码树中,也不必同时编译。Java编译器将接受您的类对任何有效包名的声明,并接受您的类位于它们所说的包中

另一方面,这并不意味着您可以在任何给定的JVM中使用声明在
java.*
javax.*
包中的类。标准JVM将拒绝从JVM外部的任何源加载属于这些包的类。您可以构建这样的类,但不能使用它们。您可以通过一个名为“”的机制,以几乎相同的方式保护您自己的包


第三方面,对于未密封的包,您确实可以从多个不同的来源加载包成员。

您的措辞让我有点困惑。我想我从你的例子中知道你的意思,但我不明白这是如何“在一个包中创建一个与其父类共享名称的类”。据我所知,这只是“在包中创建一个类”。@JohnBollinger澄清一下,创建一个与父包同名的包。因此,我在本地创建了一个包
java.nio
(因为
ByteBuffer
也位于
java.nio
,但位于不同的位置)@ElliottFrisch我很乐意,但这个方法也适用于java 8。好吧,这里是您的措辞的问题,也是一个大部分答案:没有“同名包”。存在由给定名称、句点标识的包。每个有效的包名只有一个。