Я пытаюсь создать проект с пакетами классов с различными модификаторами доступа, чтобы увидеть все характеристики классов с различными модификаторами доступа. Я попробовал иметь пакет с открытым классом, один с классом по умолчанию, а затем попытался иметь 2 других для защищенных и частных классов, но он сказал: «Недопустимый модификатор для класса privatez, для них разрешены только публичные, абстрактные & final». Почему это так. А во-вторых, проверяет материал для каждого класса - хороший способ его понять. Я пытаюсь дать лучший вопрос, чем предыдущий пост. Я также хочу изучить применение каждого модификатора доступа.Практические модификаторы доступа
ответ
Я попытался имея пакет с общественным классом, один с классом по умолчанию, а затем попытался иметь 2 другие охраняемые и частные классы, но он сказал: «Illegal модификатора для класса privatez, только общественности, абстрактный & финала разрешены "для них. Почему это так.
Простой ответ: JLS говорит, что вы не можете объявить класс верхнего уровня как private
.
Причина в том, что не имеет смысла иметь класс, который является только видимым для себя. Нет никакого способа, чтобы какой-либо другой класс когда-либо мог его использовать (отдельно, предположительно, от использования грязных трюков с отражением). Поэтому JLS просто говорит: «Это не имеет смысла, и я не разрешаю».
(Теперь вложенная класс может иметь доступ private
... но это потому, что private
private
означает для всех классов в самых крайних классов ограждающих ...)
А во-вторых, это тестирование материал для каждого класса - хороший способ понять это.
Я думаю, что лучше читать и пытаться понять учебник/учебник. Проблема в том, что если вы попытаетесь научиться, написав свои собственные примеры, вы можете легко сделать неправильные выводы из них.
Для этого примера:
package privatez; protected class privatez { }
Гипотетический protected
класс будет/может быть видна его подклассами только. Но классы всегда видны их подклассам, поэтому это не имеет никакого смысла. (Кроме того, способ предотвратить подклассы, чтобы объявить класс final
, и вы можете ограничить подклассы с помощью «частного пакета», т.е. без модификатора доступа.)
Модификатор protected
доступа только имеет смысл для вещей внутри в класс. В классе верхнего уровня нормальный смысл protected
не имеет никакого смысла.
(Это одна из проблем, связанных с попытками научиться на примерах. В итоге вы пытаетесь понять, почему компилятор отвергает примеры. Не ожидайте, что компилятор «объяснит», почему что-то не так. Это не его роль .)
, но защищенный класс может быть видимым для подкласса за пределами того же пакета, поэтому не стоит делать его защищенным. –
Мне нужно будет увидеть точный код, который вы написали/скомпилировали, чтобы ответить на этот вопрос. И точное сообщение об ошибке компиляции. –
+1 Скажите, есть ли концепция защищенного класса, тогда этот класс будет виден подклассам в том же пакете, и это так, если вы не определяете какой-либо модификатор. – havexz
Если вы хотите узнать, вы должны прочитать некоторую книгу о java.Здесь я могу только дать вам небольшой суть:
Модификаторы доступа Класс:
общественного
Класс может быть доступ за пределами пакета он является частью.
по умолчанию
Это когда вы не указать любую вещь. Класс доступен из с в пакете, он является частью.
Просто для уточнения:
private
модификатор не имеет смысла. Поскольку никто не может получить доступ к закрытому классу, ни для расширения, ни для создания экземпляра.
Скажите, существует ли концепция класса protected
, тогда этот класс будет виден подклассам в том же пакете, и это случай, если вы не определяете какой-либо модификатор.
Другие Атрибуты класса (это не доступ модификаторов):
абстрактные
Если определено, пользователь класса не может создать экземпляр. И класс, который его расширяет, должен реализовывать абстрактные методы или определять себя как абстрактный.
окончательный
Если определено, пользователь не может расширить этот класс.
возможно дубликат [Practice доступа Модификаторы] (http://stackoverflow.com/questions/11165566/practice-access-modifiers) –
@AnthonyPegram Я сделал это в лучший вопрос и на самом деле объяснил, что я интересовался. Это не повторение. –