代码之家  ›  专栏  ›  技术社区  ›  Jacob G.

在compliation期间,包(共享一个名称)是否组合在一起?

  •  2
  • Jacob G.  · 技术社区  · 6 年前

    无论如何,我很好奇是否可以创建一个扩展 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;
        }
    
        ...
    }   
    

    它也可以在Java9和Java10中编译,但只有在使用 --patch-module 编译时:

    javac --patch-module java.base=. java/nio/Test.java
    

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   John Bollinger    6 年前

    在compliation期间,包(共享一个名称)是否组合在一起?

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

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

    另一方面,这并不意味着你可以 使用 您声明位于 java.* javax.* 在任何给定的JVM中打包。标准JVM将拒绝从JVM外部的任何源加载属于这些包的类。你可以建立这样的类,但是你不能使用它们。你可以用同样的方法保护你自己的包,通过一个叫做 package sealing ".

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