Несколько классов в одном файле: модификатор private не разрешен здесь

157
14

Я не могу понять, почему этот код не компилируется:


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 как закрытый и защищенный. Может кто-нибудь объяснить мне причину этого?


Спасибо!

спросил(а) 2021-01-19T16:28:20+03:00 9 месяцев, 1 неделя назад
1
Решение
170

Из Спецификация Java Language:


Модификаторы доступа, защищенные и закрытые, относятся только к классам-членам в объявлении с непосредственным объявлением класса



Так что да, частные и защищенные модификаторы не разрешены для объявлений класса верхнего уровня.

Классы верхнего уровня могут быть общедоступными или нет, а private и protected недопустимы. Если класс объявлен общедоступным, то его можно отнести к любому пакету. В противном случае его можно отнести только к одному и тому же пакету (пространство имен).


Частный класс верхнего уровня не имеет большого смысла, потому что он не может быть отнесен ни к одному классу. По определению это было бы непригодным. private ОК для классов-членов, чтобы класс, относящийся только к этому классу.


Защищенный класс-член может быть отнесен к (1) любому классу того же пакета и из (2) любого подкласса охватывающего класса. Сопоставление этой концепции с классами верхнего уровня сложно. Первый случай покрывается классом верхнего уровня без модификаторов доступа. Второй случай не применим для классов верхнего уровня, потому что нет закрывающего класса или чего-то другого из другого пакета со специальным отношением к этому классу (например, подкласса). Из-за этого я думаю, что protected не допускается, поскольку базовая концепция не применима для классов верхнего уровня.

ответил(а) 2021-01-19T16:28:20+03:00 9 месяцев, 1 неделя назад
79

Сделайте 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;
}

ответил(а) 2021-01-19T16:28:20+03:00 9 месяцев, 1 неделя назад
65

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


Они применимы только к членам класса, которые могут быть переменными, константами, конструкторами, методами, классами и интерфейсами.


Почему:


(1) private: Что может быть значением/целью, если мы определяем класс как закрытый. Его область должна быть частной для некоторых областей. доступ по умолчанию уже является приватным пакетом. И никто не хочет, чтобы класс был закрытым исходным файлом (возможно, это объясняется), возможно, это не хорошая практика программирования, потому что Java-приложения, наконец, организованы в виде пакетов, но не в терминах исходных файлов. Любой исходный файл должен быть частью некоторого пакета, поэтому в широком/конечном представлении каждый класс/интерфейс является частью некоторого пакета, а не только некоторого .java файла. Поэтому неприменимо.


(2) protected. Если что-то защищено, оно должно быть доступно только внутри пакета и только для подклассов в других пакетах. Чтобы расширить класс в другом пакете, он должен быть доступен для всех классов в других пакетах, но protected говорит, что класс должен быть доступен только для расширенных классов. Это своего рода тупиковая ситуация. Поэтому неприменимо.


Источник: мои чтения и понимание

ответил(а) 2021-01-19T16:28:20+03:00 9 месяцев, 1 неделя назад
46

Просто не имеет частного/защищенного модификатора.

ответил(а) 2021-01-19T16:28:20+03:00 9 месяцев, 1 неделя назад
46

B должен быть закрыт для чего-то. Поместите его в определение класса A или создайте другой файл B.java и определите его там, но тогда он не может быть закрытым.

ответил(а) 2021-01-19T16:28:20+03:00 9 месяцев, 1 неделя назад
-5

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


В файле .java может быть только один открытый класс, все остальные должны быть закрытыми. Таким образом, класс A может быть общедоступным, а класс B не нуждается в модификаторах в вашем примере. Имя открытого класса должно соответствовать имени файла .java(например, A.java может содержать только один открытый класс под названием "A" ).

ответил(а) 2021-01-19T16:28:20+03:00 9 месяцев, 1 неделя назад
-6

A.java не может содержать два класса.

ответил(а) 2021-01-19T16:28:20+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема