Объединяются ли пакеты (которые имеют общее имя) во время компиляции?
Я почти уверен, что этот вопрос был задан, но я не уверен, что искать относительно этого.
Во всяком случае, мне было любопытно, если бы было возможно создать класс, который расширяет 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
Мой вопрос: как (и почему) это компилируется?
1 ответ
Объединяются ли пакеты (которые имеют общее имя) во время компиляции?
Не совсем. Имя пакета однозначно идентифицирует пакет. Существует только один для каждого имени.
Но исходные коды Java для членов пакета не обязательно должны находиться в одном и том же дереве исходных текстов или быть скомпилированными одновременно. Компилятор Java примет объявление ваших классов любого допустимого имени пакета и примет ваши классы как находящиеся в пакете, в котором, как они говорят, они находятся.
С другой стороны, это не означает, что вы можете использовать классы, которые вы объявили в java.*
или же javax.*
пакет в любой данной JVM. Стандартные JVM откажутся загружать классы, принадлежащие этим пакетам, из любого источника, внешнего для JVM. Вы можете создавать такие классы, но не можете их использовать. Вы можете защитить свои собственные пакеты почти таким же образом, с помощью механизма, называемого " запечатывание пакетов".
С третьей стороны, с незапечатанными пакетами вы действительно можете загружать элементы пакета из нескольких разных источников.