несколько классов в одном файле: частный модификатор здесь запрещен - PullRequest
15 голосов
/ 16 августа 2010

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

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

Спасибо!

Ответы [ 7 ]

20 голосов
/ 16 августа 2010

Из спецификации языка Java :

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

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

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

Частный класс верхнего уровня не имеет особого смысла, потому что на него нельзя ссылаться ни из одного класса. Это было бы непригодно по определению. private нормально для классов-членов, чтобы сделать класс ссылающимся только на включающий его класс.

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

3 голосов
/ 16 августа 2010

Сделайте 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;
}
1 голос
/ 01 февраля 2014

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

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

Почему:

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

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

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

0 голосов
/ 16 августа 2010

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

0 голосов
/ 16 августа 2010

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

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

0 голосов
/ 16 августа 2010

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

0 голосов
/ 16 августа 2010

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

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