Java: почему отдельный класс должен быть закрытым - PullRequest
0 голосов
/ 26 марта 2012

Например, у меня есть имя файла с именем "A.java". Вот его структура:

public class A{
}

private class B{
   // no error
}
public class C{
   //error : must declare at different file
}

Я думаю, что это правила Java. Но я действительно хочу знать: ПОЧЕМУ Java должен сделать это.

Спасибо:)

Ответы [ 5 ]

3 голосов
/ 26 марта 2012

Вы можете найти в разделе 7.6 JLS:

Когда пакеты хранятся в файловой системе (§7.2.1), хост-система может выбрать принудительное ограничение, что она являетсяОшибка времени компиляции, если тип не найден в файле с именем, состоящим из имени типа и расширения (например, .java или .jav), если выполняется одно из следующих условий:

Типупоминается кодом в других единицах компиляции пакета, в котором объявлен тип.Тип объявлен как открытый (и поэтому потенциально доступен из кода в других пакетах).Это ограничение подразумевает, что на единицу компиляции должно быть не более одного такого типа.Это ограничение облегчает компилятору языка программирования Java или реализации виртуальной машины Java поиск именованного класса в пакете;например, исходный код для общедоступного типа wet.sprocket.Toad будет найден в файле Toad.java в каталоге wet / sprocket, а соответствующий объектный код будет найден в файле Toad.class в том же каталоге.

1 голос
/ 26 марта 2012

Это определено в Спецификации языка Java .

1 голос
/ 26 марта 2012

В файле .java может быть только один открытый класс, так как у открытых классов должно быть то же имя, что и у исходного файла.

Из вашего примера: если у вас есть файл "A.java", только класс А. может быть общедоступным.

0 голосов
/ 26 марта 2012
public class A{
}

private class B{
   // no error
}

Это даже не должно работать ( см. Спецификацию языка Java ):

Ошибка времени компиляции, если объявление типа верхнего уровня содержит какой-либо одиниз следующих модификаторов доступа: защищенный, закрытый или статический

Вы уверены, что не объявили класс B как внутренний класс?

Это не имеет смыслаобъявить класс верхнего уровня как private, поскольку private ограничивает видимость членов включающим классом / интерфейсом верхнего уровня.Если ваш класс относится к классу верхнего уровня (независимо от того, находится ли он в своем собственном файле), вам, по крайней мере, потребуется видимость на уровне пакета (без модификаторов вообще).

0 голосов
/ 26 марта 2012

хорошо,

у вас не может быть структуры, это файл с именем «A.java», поскольку вы предполагали, что публичный класс называется «ClassA», тогда имя файла должно быть ClassA.java. Теперь, насколько я понимаю, идея этого ограничения просто должна быть организована. Таким образом, вы можете иметь физическое происхождение каждого класса.

Без этого ограничения у вас может быть, например, «ClassC» из «ниоткуда», и может быть действительно сложно отследить исходный код.

привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...