Я не могу понять, почему этот код не компилируется:
class A {
public static void main(String[] args) {
System.out.println("hi");
}
}
private class B {
int a;
}
Я сохраняю содержимое в файле с именем A.java
- и получаю ошибку :
modifier private not allowed here // where I have defined class B
Это происходит, когда я пытаюсь использовать B как частную и защищенную. Может кто-нибудь объяснить мне причину этого?
Спасибо!
Модификаторы доступа protected и private относятся только к классам-членам в объявлении класса, непосредственно включающем
Так что да, частный а модификаторы protected не допускаются для объявлений классов верхнего уровня.
Классы верхнего уровня могут быть общедоступными или нет, в то время как частные
и защищенные
не допускаются. Если класс объявлен общедоступным, то на него можно ссылаться из любого пакета. В противном случае на него можно ссылаться только из того же пакета (пространства имен).
Приватный класс верхнего уровня не имеет особого смысла, потому что на него нельзя ссылаться из любого класса. Это было бы непригодно по определению. private
- это нормально для классов-членов, чтобы сделать класс относимым только к его охватывающему классу.
На защищенный класс-член можно ссылаться из (1) любого класса того же пакета и из (2) любого подкласса включающего класса. Сопоставить эту концепцию с классами верхнего уровня сложно. Первый случай относится к классу верхнего уровня без модификаторов доступа.Второй случай неприменим для классов верхнего уровня, потому что нет включающего класса или чего-то еще из другого пакета с особым отношением к этому классу (например, подкласса). Из-за этого я думаю, что protected
не допускается, потому что его основная концепция не применима для классов верхнего уровня.
Сделайте B вложенным в A, например:
class A {
public static void main(String[] args) {
System.out.println("hi");
}
private class B {
int a;
}
}
Или переместите B в отдельный файл. Также вы можете придерживаться уровня доступа по умолчанию, таким образом, к классу можно получить доступ только из пакета:
class A {
public static void main(String[] args) {
System.out.println("hi");
}
}
class B {
int a;
}
B должен быть приватным для чего-то. Поместите его в определение класса A или создайте другой файл, B.java, и определите его там, но тогда он не может быть частным.
Если вы не используете ключевое слово public для класса, по умолчанию он будет частным (видимым только внутри файла).
Для каждого файла .java может быть только один открытый класс, все остальные должны быть закрытыми. Таким образом, класс A может быть общедоступным, а класс B в вашем примере не нуждается в каких-либо модификаторах. Имя открытого класса должно совпадать с именем файла .java (например, A.java может содержать только один открытый класс с именем «A»).