首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在遵从过程中,包(共享名称)合并了吗?

在遵从过程中,包(共享名称)合并了吗?
EN

Stack Overflow用户
提问于 2018-08-07 00:49:31
回答 1查看 39关注 0票数 2

我几乎肯定有人问过这个问题,但我不知道该找什么。

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

代码语言:javascript
复制
// 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);
}

但是,我发现如果您在一个与父包共享名称的包中创建类,那么它将非常完美地编译。

代码语言:javascript
复制
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

代码语言:javascript
复制
javac --patch-module java.base=. java/nio/Test.java

我的问题是:它是如何(以及为什么)编译的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-07 01:23:40

在遵从过程中,包(共享名称)合并了吗?

不完全同意。包名唯一标识包。每个名字只有一个。

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51717382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档