2010-08-16 5 views
11

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

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

Спасибо!

+0

Внутренние классы могут быть частными. –

+0

Нет, это не зависит от A – SlowAndSteady

ответ

13

От Java Language specification:

The access modifiers protected and private pertain only to member classes within a directly enclosing class declaration

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

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

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

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

+0

Спасибо Андреасу, но не могли бы вы объяснить, почему разработчики Java могли бы навязать это ограничение? Я знаю, что этот вопрос может показаться абсурдным, но мне любопытно. Благодаря ! – SlowAndSteady

+1

ОК. Получил логику для частных, но как насчет защищенных? «Защищенный», безусловно, более открытый, чем спецификатор «default» - который был разрешен! – SlowAndSteady

0

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

+0

Я хотел сказать, что я пробовал как частные, так и защищенные отдельно, но он не работает в обоих случаях – SlowAndSteady

+0

Я просто экспериментирую с контролем доступа, я просто хочу знать причину ошибки , – SlowAndSteady

0

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

+0

Это правило в Java, чтобы сделать класс/переменную частной или защищенной «чем-то»? Возможно, у нас есть отдельные классы/переменные, частные или защищенные? – SlowAndSteady

+0

Мое высказывание было более абстрактным, чем концептуальным. Основная проблема заключалась в том, что вы объявляли еще один класс в файле A.java. Оказалось, что вы хотите сделать B частным для A или внутри «чего-то». Однако ваше утверждение относительно того, можем ли мы иметь самостоятельные классы, частные или защищенные, на самом деле не имеет смысла, поскольку модификаторы имеют только контекст, когда они относительно чего-то. – linuxuser27

2

сделать B вложен А, как это:

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; 
} 
+0

Я не хочу гнездиться или переходить в другой файл. Я просто хочу знать причину ошибки – SlowAndSteady

+0

Ошибка на самом деле очевидна. Если вы не делаете этого вложенного или отдельного файла, класс не будет доступен из любого места, поскольку он является приватным. Вы не можете сделать его общедоступным, потому что у java есть ограничение на один общедоступный класс верхнего уровня для каждого файла. –

+0

Но как насчет защищенных? – SlowAndSteady

-1

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

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

+0

Неправильное использование. Класс верхнего уровня без модификатора - это * package * private. Его можно отнести к любому классу внутри одного пакета. –

-2

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

+2

Да, это возможно, если только один является общедоступным (тот, который дает исходное имя его имени), и все другие непубличные (без доступа к модификатору, пакет a.k.a), исходный файл может содержать несколько классов. –

+1

-1, извините, это просто не так, как объясняет Андрей. – djna

1

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

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

Почему:

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

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

Источник: Мои данные

+0

До тех пор, пока он не является общедоступным, класс может иметь имя, отличное от имени файла. Класс также может иметь основной метод. Файл класса будет сгенерирован с именем класса, но не с именем исходного файла. Имя класса должно использоваться для его выполнения. – Venkataswamy

Смежные вопросы