несколько классов в одном файле: здесь не допускается использование модификатора private

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

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

Спасибо!

16
задан Sunil Garg 22 March 2017 в 12:51
поделиться

6 ответов

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

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

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

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

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

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

21
ответ дан 30 November 2019 в 22:01
поделиться

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

-2
ответ дан 30 November 2019 в 22:01
поделиться

Сделайте 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;
}
3
ответ дан 30 November 2019 в 22:01
поделиться

Просто не иметь модификаторов private / protected.

0
ответ дан 30 November 2019 в 22:01
поделиться

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

0
ответ дан 30 November 2019 в 22:01
поделиться

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

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

-1
ответ дан 30 November 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: